当前位置: 技术问答>linux和unix
一个简单的管道通信程序
来源: 互联网 发布时间:2017-04-29
本文导语: 部分代码: char parent[]={"A message from parent"}; char child[]={"A message from child"}; int main() { int chan1[2],chan2[2]; char buf[100]; if(pipe(chan1)==-1||pipe(chan2)==-1) { perror("pipe error"); exit(1); } if(fork()) ...
部分代码:
char parent[]={"A message from parent"};
char child[]={"A message from child"};
int main()
{
int chan1[2],chan2[2];
char buf[100];
if(pipe(chan1)==-1||pipe(chan2)==-1)
{
perror("pipe error");
exit(1);
}
if(fork())
{
close(chan1[0]);
close(chan2[1]);
write(chan1[1],parent,sizeof parent);
close (chan1[1]);
read(chan2[0],buf,100);
printf("parent process:%sn",buf);
close(chan2[0]);
printf("%dn",getpid());
}
else
{
close(chan1[1]);
close(chan2[0]);
read(chan1[0],buf,100);
printf("child process:%s n",buf);
write(chan2[1],child,sizeof child);
close(chan2[1]);
close(chan1[0]);
printf("%dn",getpid());
}
return 0;
}
问题有二:
1、if(fork())语句判断的什么?不是判断fork()是否等于0吗?为什么if(fork())运行的是父进程,else运行的是子进程?
2、结果是else里的子进程先运行的,为什么读取chan[0]的时候,输出的是还没运行的父进程中写入的字符串?
char parent[]={"A message from parent"};
char child[]={"A message from child"};
int main()
{
int chan1[2],chan2[2];
char buf[100];
if(pipe(chan1)==-1||pipe(chan2)==-1)
{
perror("pipe error");
exit(1);
}
if(fork())
{
close(chan1[0]);
close(chan2[1]);
write(chan1[1],parent,sizeof parent);
close (chan1[1]);
read(chan2[0],buf,100);
printf("parent process:%sn",buf);
close(chan2[0]);
printf("%dn",getpid());
}
else
{
close(chan1[1]);
close(chan2[0]);
read(chan1[0],buf,100);
printf("child process:%s n",buf);
write(chan2[1],child,sizeof child);
close(chan2[1]);
close(chan1[0]);
printf("%dn",getpid());
}
return 0;
}
问题有二:
1、if(fork())语句判断的什么?不是判断fork()是否等于0吗?为什么if(fork())运行的是父进程,else运行的是子进程?
2、结果是else里的子进程先运行的,为什么读取chan[0]的时候,输出的是还没运行的父进程中写入的字符串?
|
fork()后父子进程执行顺序的不确定性。。用vfork()吧!