#include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> main() { int fd[2],pid,pir,n,i; char send[50]="b",receive[50]="b"; pipe(fd); pid=fork(); if(pid==0) { while(send[0]!='a') { printf("Child1 inputs information from keyboard:\n"); scanf("%s",send); lockf(fd[1],1,0); write(fd[1],send,strlen(send)); lockf(fd[1],0,0); sleep(1); } } else { pir=fork(); if(pir==0) { while (receive[0]!='a') { lockf(fd[0],1,0); n=read(fd[0],receive,20); lockf(fd[0],0,0); printf("Child2 received :%s\n",receive); } } else { wait(0); wait(0); printf("parent is kill!\n"); } } }
时间: 2023-06-27 19:05:47 浏览: 125
这是一个使用管道(pipe)实现进程间通信的程序,包含一个父进程和两个子进程。
父进程创建了一个管道,然后 fork 了两个子进程,一个子进程从键盘输入信息,写入管道;另一个子进程从管道读取信息并输出到屏幕。
程序的大致流程如下:
1. 父进程调用 pipe 函数创建一个管道。
2. 父进程 fork 出两个子进程 Child1 和 Child2。
3. Child1 进程中,循环从键盘读取输入,写入管道中。
4. Child2 进程中,循环从管道中读取信息,输出到屏幕。
5. 父进程中,等待两个子进程结束后打印一条信息并退出程序。
但是程序存在一些问题:
1. 管道写入和读取时应该先加锁,避免多个进程同时写入或读取造成数据混乱。
2. 代码中使用了字符串数组,但没有考虑到字符串长度可能超过数组大小,造成缓冲区溢出等问题。
3. 程序中使用了 sleep 函数,但并没有说明其作用,可能会导致程序不可预期的行为。
4. 程序中没有进行错误处理,如 pipe 函数调用失败、fork 函数调用失败、write 函数调用失败等情况。
阅读全文