#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //信号量头文件 #include #define MAX_PIPE_CAPACIPY 100 int main() { int fd[2]; sem_t *Mutex; sem_t *send1, *send2, *send3; sem_t *receive1, *receive2, *receive3; //创造有名信号量 Mutex = sem_open("Mutex", O_CREAT, 0666, 1);//管道使用信号量 send1 = sem_open("send1", O_CREAT, 0666, 1);//线程消息信号量,为一,表明子进程有消息发送,或者父进程有消息接受, send2 = sem_open("send2", O_CREAT, 0666, 1); send3 = sem_open("send3", O_CREAT, 0666, 1); receive1 = sem_open("receive1", O_CREAT, 0666, 0); receive2 = sem_open("receive2", O_CREAT, 0666, 0); receive3 = sem_open("receive3", O_CREAT, 0666, 0); int ret = pipe(fd);//创建无名管道,fd{0}只能读,fd{1}只能写,如果进程错误输出错误 if (ret == -1) { printf("pipe create errorn"); exit(-1); } //定义三个进程,创建三个信号量 pid_t pid1; pid_t pid2; pid_t pid3; pid1 = fork(); if(pid1 > 0) { pid2 = fork(); if(pid2 > 0) { pid3 = fork(); } } //pid不正常,则从系统中删除有名信号量,推出程序 if(pid1 < 0 || pid2 < 0 || pid3 < 0) { sem_unlink("Mutex"); sem_unlink("send1"); sem_unlink("send2"); sem_unlink("send3"); sem_unlink("receive1"); sem_unlink("receive2"); sem_unlink("receive3"); exit(0);//正常运行程序并退出程序 } if(pid1 == 0) { close(fd[0]);//fd[0]对应管道的读口 sem_wait(send1);//前面我们定义了send1为1,此处说明子进程产生消息。 sem_wait(Mutex);//产生消息后,等待管道的使用权。 char buf[3]="111"; write(fd[1], buf, sizeof(buf));//在子进程中写入, printf("pid:%d 进程1放入数据:%sn",getpid(),buf); sleep(1); sem_post(Mutex);//释放信号量 sem_post(receive1); } else if(pid2 == 0) { close(fd[0]); sem_wait(send2); sem_wait(Mutex); char buf[3]="222"; write(fd[1], buf, sizeof(buf)); printf("pid:%d 进程2放入数据:%sn",getpid(),buf); sleep(1); sem_post(Mutex); sem_post(receive2); } else if(pid3 == 0) { close(fd[0]); sem_wait(send3); sem_wait(Mutex); char buf[3]="333"; write(fd[1], buf, sizeof(buf)); printf("pid:%d 进程3放入数据:%sn",getpid(),buf); sleep(1); sem_post(Mutex); sem_post(receive3); } else//父进程 { close(fd[1]);//关闭写, sem_wait(receive1);//读数据阻塞 sem_wait(receive2); sem_wait(receive3); sem_wait(Mutex); char str[4096]; read(fd[0], str, 4096);//读口读到的数据放在str里面 printf("pid:%d 父进程接收数据:%sn", getpid(), str); sleep(1); sem_post(Mutex); sem_post(send1); sem_post(send2); sem_post(send3); } return 0; }



