当前位置: 技术问答>linux和unix
进程间通信的pipe ,很简单
来源: 互联网 发布时间:2017-02-12
本文导语: #include #include int main() { int id=0; int pid=0; char buffer[512]; char mbuffer[512]; id=fork(); int file[2]; pipe(file); if(id==-1) { printf("Erro"); } else if(id==0) { c...
#include
#include
int main()
{
int id=0;
int pid=0;
char buffer[512];
char mbuffer[512];
id=fork();
int file[2];
pipe(file);
if(id==-1)
{
printf("Erro");
}
else if(id==0)
{
close(file[0]);
write(file[1],"i am clird 1n",strlen("i am clird 1n"));
}
else if(id>0)
{
pid=fork();
if(pid==-1)
{
printf("Erro");
}
else if(pid==0)
{
close(file[0]);
write(file[1],"i am child 2n",strlen("i am child 2n"));
}
else if(pid>0)
{
close(file[1]);
read(file[0],buffer,strlen("i am clird 1n"));
printf(buffer);
read(file[0],mbuffer,strlen("i am clird 1n"));
printf(mbuffer);
}
}
}
就是父进程创建2个子进程,子进程写一句给父进程,但是,读不出两句话
#include
int main()
{
int id=0;
int pid=0;
char buffer[512];
char mbuffer[512];
id=fork();
int file[2];
pipe(file);
if(id==-1)
{
printf("Erro");
}
else if(id==0)
{
close(file[0]);
write(file[1],"i am clird 1n",strlen("i am clird 1n"));
}
else if(id>0)
{
pid=fork();
if(pid==-1)
{
printf("Erro");
}
else if(pid==0)
{
close(file[0]);
write(file[1],"i am child 2n",strlen("i am child 2n"));
}
else if(pid>0)
{
close(file[1]);
read(file[0],buffer,strlen("i am clird 1n"));
printf(buffer);
read(file[0],mbuffer,strlen("i am clird 1n"));
printf(mbuffer);
}
}
}
就是父进程创建2个子进程,子进程写一句给父进程,但是,读不出两句话
|
除了上面提到的,还有就是要初始化buffer和mbuffer
完整代码:
#include
#include
#include
int main()
{
int id=0;
int pid=0;
char buffer[512] = {0}; // 记得要初始化
char mbuffer[512] = {0};
//char buffer[512];
//char mbuffer[512];
int file[2];
pipe(file);
id=fork(); // fork是在调用pipe之后的
if (id==-1)
{
printf("Errorn");
}
else if (id==0)
{
close(file[0]);
write(file[1],"I am child 1n",strlen("I am child 1n"));
}
else if (id>0)
{
pid=fork();
if (pid==-1)
{
printf("Errorn");
}
else if (pid==0)
{
close(file[0]);
write(file[1],"I am child 2n",strlen("I am child 2n"));
}
else if (pid>0)
{
close(file[1]);
read(file[0],buffer,strlen("I am child 1n"));
printf(buffer);
read(file[0],mbuffer,strlen("I am child 1n"));
printf(mbuffer);
}
}
}
编译输出:
[zcm@t #77]$make
gcc -g -o a a.c
[zcm@t #78]$./a
I am child 1
I am child 2
|
那是因为你的pipe调用放在fork()之后了
拿到前面去
int file[2];
pipe(file);
id=fork();
拿到前面去
int file[2];
pipe(file);
id=fork();
|
一次read就读干净了, 所以只打印一次, 而且没加终结符.