1、Linux 进程控制实验报告实验名称: Linux 进程控制实验要求: 一.编写一个 Linux 系统 C 程序,由父亲创建 2 个子进程,再由子进程各自从控制台接收一串字符串,保存在各自的全局字符串变量中,然后正常结束。父进程调用 waitpid 等待子进程结束,并分别显示每个子进程的进程标识号和所接收的字符串。二. 父进程创建一子进程,父进程向子进程发送数据,子进程接收数据,并写入文件。关键问题: 一.需要用共享内存或使用 vfork()函数创建子进程进行进程之间的数据共享及传递。父进程必须等待子进程结束才能继续执行。二.注意信号的使用。子进程需等待父进程发送信号才执行相应操作。父,子进程
2、之间的通信需要用到共享内存或者父进程用 vfork()创建子进程。设计思路: 一.使用共享内存实现数据共享,子进程一用 shmaddr1 保存输入的字符串,子进程二用 shmaddr2 保存字符串。父进程等待两个子进程分别输入完字符串,然后再分别把数据显示出来。二.用共享内存的方法来实现父子进程之间的通信,首先建立共享内存区域,然后建立子进程,并让子进程等待父进程信号。在父进程中输入字符串,并把此字符串保存在共享内存区域,然后向子进程发出信号 SIGUSR1,若子进程接受到 SIGUSR1 信号,则把父进程保存在共享内存区域的字符串取出,并把它写入文件。关键代码:一#include #incl
3、ude #include #include #include #include #include #define KEY 1234#define SIZE 64char* shmaddr1;char* shmaddr2; main()pid_t pid1;pid_t pid2;char* str1;char* str2;int shmid1; int shmid2; shmid1=shmget(23,SIZE,IPC_CREAT|0600); shmid2=shmget(24,SIZE,IPC_CREAT|0600); if (pid1=fork()#include#include#inclu
4、de#include#include#include#include#include#define key 1024#define size 160static void sign(int);int shmid;char* shmaddr;main()pid_t pid;char str20;shmid=shmget(key,size,IPC_CREAT|0600);if(pid=fork()0)perror(“创建子进程错误!n“);exit(0);else if(pid=0)if(signal(SIGUSR1,sign)=SIG_ERR)printf(“SIGUSR1 错误!n“);exi
5、t(0);pause();printf(“子进程结束!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(“子进程接收到 SIGUSR1.n“);shmaddr=(char*)shmat(shmid,NULL,0);if(fd=open(“testfile.txt“,O_RDWR|O_CREAT|O_TRUNC)=-1)printf(“n 打开文件错误!n“);return 0;elseprintf(“写入 :%sn“,shmaddr);write(fd,shmaddr,20);close(fd);shmdt(shmaddr);实验总结: 经过此次实验,我学会了如何通过 shm 共享内存实现各进程间的数据共享,以及如何在父子进程之间发送信号和传输数据以及一些保存文件的操作,通过这次实验我受益良多。