#include "kernel/types.h" #include "user/user.h" int main(){ int pid=fork(); int pfd[2],cpd[2]; pipe(pfd); pipe(cfd); char buf[10]; if(pid<0){ fptintf(0,"fork error\n"); exit(1); }else if(pid==0){ //child close(pfd[1]); read(pfd[0],buf,4); printf("<%d>:received %s\n",getid(),buf); close(cfd[0]); write(cfd[1],"pong",4); }else{ close(pfd[0]); write(pfd[1],"ping",4); close(cfd[1]); read(cfd[0],buf,4); printf("<%d>:receive %s\n",getid(),buf); } exit(0); }
时间: 2024-01-15 21:03:40 浏览: 32
这是一个使用管道(pipe)进行进程间通信的示例程序,包含一个父进程和一个子进程。
程序的功能是父进程向子进程发送字符串“ping”,子进程接收到后向父进程回复字符串“pong”。
程序的思路是使用 pipe 函数创建两个管道,一个用于父进程向子进程发送数据,另一个用于子进程向父进程发送数据。然后使用 fork 函数创建子进程,父子进程分别关闭自己不需要的管道端口,然后进行读写操作,实现进程间通信。
需要注意的是,程序中的 cfd 数组定义有误,应该是 cpd 数组。同时,代码中的 printf 函数中使用了错误的格式化字符串,应该是 %d 而不是 %id。正确的程序代码如下:
```c
#include "kernel/types.h"
#include "user/user.h"
int main(){
int pid=fork();
int pfd[2],cpd[2];
pipe(pfd);
pipe(cpd);
char buf[10];
if(pid<0){
fprintf(0,"fork error\n");
exit(1);
}else if(pid==0){
//child
close(pfd[1]);
read(pfd[0],buf,4);
printf("<%d>:received %s\n",getpid(),buf);
close(cpd[0]);
write(cpd[1],"pong",4);
}else{
close(pfd[0]);
write(pfd[1],"ping",4);
close(cpd[1]);
read(cpd[0],buf,4);
printf("<%d>:receive %s\n",getpid(),buf);
}
exit(0);
}
```