当前位置: 技术问答>linux和unix
用无名管道实现进程通信,可是出错了,打击哦
来源: 互联网 发布时间:2016-10-15
本文导语: 大家好,我在学习linux,想实现两个进程之间的通信,其功能如下: 父进程获取输入的字符串,送入到管道中,然后子进程获取输出。 我的代码入下: int main (int argc, char *argv[]) { int f_des[2]; char str[10...
大家好,我在学习linux,想实现两个进程之间的通信,其功能如下:
父进程获取输入的字符串,送入到管道中,然后子进程获取输出。
我的代码入下:
可当我运行时,子进程从无名管道中读出的信息总是会出错,当我输入exit的时候,它会死循环不停的读出数据,这是为什么呢?
结果如下:
weitch@weitch-desktop:~/linux学习/program$ ./无名管道
hello
Message sent by parent:hello
Meaage received by Chile:hello
csdn
Message sent by parent:csdn
Meaage received by Chile:csdno
第二个就不能正确读取信息了,这是什么呢?我快崩溃了...
父进程获取输入的字符串,送入到管道中,然后子进程获取输出。
我的代码入下:
int main (int argc, char *argv[])
{
int f_des[2];
char str[1024];
if(pipe(f_des) == -1) //生成无名管道
{
perror("pipe error");
exit(1);
}
switch(fork())
{
case -1:
perror ("Fork error");
exit(2);
case 0: //子进程
while(1)
{
close(f_des[1]);
if(read(f_des[0],str,1024) != -1) //读取成功
{
if(strcmp(str,"exit") == 0)
exit(0);
printf ("Meaage received by Chile:%sn",str);
fflush(stdout);
}
}
default : //父进程
while(1)
{
scanf ("%s",str); //获取字符串输入
close(f_des[0]);
if (write(f_des[1],str,strlen(str)) != -1)
{
printf ("Message sent by parent:%sn",str);
fflush(stdout);
}
if(strcmp(str,"exit") == 0)
break;
}
}
exit(0);
}
可当我运行时,子进程从无名管道中读出的信息总是会出错,当我输入exit的时候,它会死循环不停的读出数据,这是为什么呢?
结果如下:
weitch@weitch-desktop:~/linux学习/program$ ./无名管道
hello
Message sent by parent:hello
Meaage received by Chile:hello
csdn
Message sent by parent:csdn
Meaage received by Chile:csdno
第二个就不能正确读取信息了,这是什么呢?我快崩溃了...
|
#include
#include
#include
#include
int main (int argc, char *argv[])
{
int f_des[2];
char str[1024];
if(pipe(f_des) == -1) //生成无名管道
{
perror("pipe error");
exit(1);
}
switch(fork())
{
case -1:
perror ("Fork error");
exit(2);
case 0: //子进程
close(f_des[1]);
while(1)
{
memset(str,0,1024);//每次读取前要把缓冲区重置为0
if(read(f_des[0],str,1024) != -1) //读取成功
{
if(strcmp(str,"exit") == 0)
exit(0);
printf ("Meaage received by Child:%sn",str);
fflush(stdout);
}
}
default : //父进程
close(f_des[0]);
while(1)
{
scanf ("%s",str); //获取字符串输入
if (write(f_des[1],str,strlen(str)) != -1)
{
printf ("Message sent by parent:%sn",str);
fflush(stdout);
}
if(strcmp(str,"exit") == 0)
break;
}
}
exit(0);
}