linux系统进程控制实验报告,Linux进程控制实验报告.doc
里奴性進(jìn)程控制實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)名稱: Linux進(jìn)程控制
實(shí)驗(yàn)要求:一.編寫一個(gè)Linux系統(tǒng)C程序,由父親創(chuàng)建2個(gè)子進(jìn)程,再由子進(jìn)程各自從控制臺接收一串字符串,保存在各自的全局字符串變量中,然后正常結(jié)束。父進(jìn)程調(diào)用waitpid等待子進(jìn)程結(jié)束,并分別顯示每個(gè)子進(jìn)程的進(jìn)程標(biāo)識號和所接收的字符串。
二. 父進(jìn)程創(chuàng)建一子進(jìn)程,父進(jìn)程向子進(jìn)程發(fā)送數(shù)據(jù),子進(jìn)程接收數(shù)據(jù),并寫入文件。
關(guān)鍵問題: 一.需要用共享內(nèi)存或使用vfork()函數(shù)創(chuàng)建子進(jìn)程進(jìn)行進(jìn)程之間的數(shù)據(jù)共享及傳遞。父進(jìn)程必須等待子進(jìn)程結(jié)束才能繼續(xù)執(zhí)行。
二.注意信號的使用。子進(jìn)程需等待父進(jìn)程發(fā)送信號才執(zhí)行相應(yīng)操作。父,子進(jìn)程之間的通信需要用到共享內(nèi)存或者父進(jìn)程用vfork()創(chuàng)建子進(jìn)程。
設(shè)計(jì)思路: 一.父進(jìn)程使用vfork()創(chuàng)建兩個(gè)子進(jìn)程,以此實(shí)現(xiàn)進(jìn)程之間的通信。子進(jìn)程一用str1保存輸入的字符串,子進(jìn)程二用str2保存字符串。父進(jìn)程用waitpid函數(shù)等待兩個(gè)子進(jìn)程分別輸入完字符串,然后再分別把str1,str2顯示出來。
二.用共享內(nèi)存的方法來實(shí)現(xiàn)父子進(jìn)程之間的通信,首先建立共享內(nèi)存區(qū)域,然后建立子進(jìn)程,并讓子進(jìn)程等待父進(jìn)程信號。在父進(jìn)程中輸入字符串,并把此字符串保存在共享內(nèi)存區(qū)域,然后向子進(jìn)程發(fā)出信號SIGUSR1,若子進(jìn)程接受到SIGUSR1信號,則把父進(jìn)程保存在共享內(nèi)存區(qū)域的字符串取出,并把它寫入文件。
關(guān)鍵代碼:
一.
#include
#include
#include
#include
main()
{
pid_t pid1,pid2;
char str1[20],str2[20];
if((pid1=vfork())<0)
{
perror("創(chuàng)建子進(jìn)程一錯(cuò)誤!\n");
exit(0);
}
else if(pid1==0)
{
printf("輸入字符串一:");
scanf("%s",str1);
exit(0);
}
if((pid2=vfork())<0)
{
perror("創(chuàng)建子進(jìn)程二錯(cuò)誤!\n");
exit(0);
}
else if(pid2==0)
{
printf("輸入字符串二:");
scanf("%s",str2);
exit(0);
}
waitpid(pid1,NULL,0);
waitpid(pid2,NULL,0);
printf("你輸入的字符串一:%s\n",str1);
printf("你輸入的字符串二:%s\n",str2);
}
二.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define key 1024
#define size 160
static void sign(int);
int shmid;
char* shmaddr;
main()
{
pid_t pid;
char str[20];
shmid=shmget(key,size,IPC_CREAT|0600);
if((pid=fork())<0)
{
perror("創(chuàng)建子進(jìn)程錯(cuò)誤!\n");
exit(0);
}
else if(pid==0)
{
if(signal(SIGUSR1,sign)==SIG_ERR)
{
printf("SIGUSR1錯(cuò)誤!\n");
exit(0);
}
pause();
printf("子進(jìn)程結(jié)束!\n");
exit(0);
}
sleep(1);
shmaddr=(char*)shmat(shmid,NULL,0);
printf("請輸入字符串:");
scanf("%s",str);
strcpy(shmaddr,str);
shmdt(shmaddr);
kill(pid,SIGUSR1);
wait();
shmctl(shmid,IPC_RMID,NULL);
}
static void sign(int signnum)
{
int fd;
char* shmaddr;
if(signnum==SIGUSR1)
{
printf("子進(jìn)程接收到SIGUSR1.\n");
shmaddr=(char*)shmat(shmid,NULL,0);
if((fd=open("testfile.txt",O_RDWR|O_CREAT|O_
總結(jié)
以上是生活随笔為你收集整理的linux系统进程控制实验报告,Linux进程控制实验报告.doc的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1个显示器分割2画面_我家房子100㎡,
- 下一篇: java定义一个矩阵的类_java写入一