资源描述:
《Linux进程控制实验报告.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Linux进程控制实验报告实验名称:Linux进程控制实验要求:一.编写一个Linux系统C程序,由父亲创建2个子进程,再由子进程各自从控制台接收一串字符串,保存在各自的全局字符串变量中,然后正常结束。父进程调用waitpid等待子进程结束,并分别显示每个子进程的进程标识号和所接收的字符串。二.父进程创建一子进程,父进程向子进程发送数据,子进程接收数据,并写入文件。关键问题:一.需要用共享内存或使用vfork()函数创建子进程进行进程之间的数据共享及传递。父进程必须等待子进程结束才能继续执行。二.
2、注意信号的使用。子进程需等待父进程发送信号才执行相应操作。父,子进程之间的通信需要用到共享内存或者父进程用vfork()创建子进程。设计思路:一.使用共享内存实现数据共享,子进程一用shmaddr1保存输入的字符串,子进程二用shmaddr2保存字符串。父进程等待两个子进程分别输入完字符串,然后再分别把数据显示出来。二.用共享内存的方法来实现父子进程之间的通信,首先建立共享内存区域,然后建立子进程,并让子进程等待父进程信号。在父进程中输入字符串,并把此字符串保存在共享内存区域,然后向子进程发出信号
3、SIGUSR1,若子进程接受到SIGUSR1信号,则把父进程保存在共享内存区域的字符串取出,并把它写入文件。关键代码:一.#include#include#include#include#include#include#include#defineKEY1234#defineSIZE64char*shmaddr1;char*s
4、hmaddr2;main(){pid_tpid1;pid_tpid2;char*str1;char*str2;intshmid1;intshmid2;shmid1=shmget(23,SIZE,IPC_CREAT
5、0600);shmid2=shmget(24,SIZE,IPC_CREAT
6、0600);if((pid1=fork())<0){printf("creat1fail!");exit(0);}elseif(pid1==0){shmaddr1=(char*)shmat(shmid1,NU
7、LL,0);printf("creat1successfully!");scanf("%s",str1);printf("youenter:%s",str1);strcpy(shmaddr1,str1);shmdt(shmaddr1);exit(0);}wait();if((pid2=fork())<0){printf("creat2fail!");exit(0);}elseif(pid2==0){shmaddr2=(char*)shmat(shmid2,NULL,0);printf(
8、"creat2successfully!");scanf("%s",str2);printf("youenter:%s",str2);strcpy(shmaddr2,str2);shmdt(shmaddr2);exit(0);}wait();shmaddr1=(char*)shmat(shmid1,NULL,0);shmaddr2=(char*)shmat(shmid2,NULL,0);printf("oneis%s",shmaddr1);printf("twois%s",shma
9、ddr2);shmdt(shmaddr1);shmdt(shmaddr2);shmctl(shmid1,IPC_RMID,NULL);shmctl(shmid2,IPC_RMID,NULL);exit(0);}实验结果:二.#include#include#include#include#include#include#include#include10、ys/ipc.h>#include#definekey1024#definesize160staticvoidsign(int);intshmid;char*shmaddr;main(){pid_tpid;charstr[20];shmid=shmget(key,size,IPC_CREAT
11、0600);if((pid=fork())<0){perror("创建子进程错误!");exit(0);}elseif(pid==0){if(signal(SIGUS