由于我刚刚开始使用这些概念,我可能会遗漏一些基本的东西。我试图使用管道链接父进程和子进程(由fork()函数创建)。在父进程中,我想写入管道描述符(af[1]
),并在关闭写入结束后,我想从管道的读取端读取描述符(af[0]
)儿童过程。
这是我的代码:
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <cstdlib>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
using namespace std;
int main()
{
pid_t pid1;
pid1 = fork();
int af[2],nbytes,wbytes;
pipe(af);
char inside[20];
if(pid1 == -1)
{
cout << "No child process formed: " << getpid() <<endl;
exit(1);
}
else if(pid1 == 0)
{ cout<< "inchild" <<endl;
close(af[1]);
nbytes = read(af[0],inside,strlen(inside));
cout << "read bytes: "<< nbytes << endl;
cout << "child(read) inside descriptor: " << inside << endl;
close(af[0]);
cout << "in child's end" << endl;
exit(0);
}
else
{ cout<< "inparent" << endl;
close(af[0]);
wbytes = write(af[1],"Hello World",12);
cout<< "wrote bytes: " << wbytes<<endl;
cout << "Parent(write) inside string: " << af[1] << endl;
close(af[1]);
cout << "in parent's end" << endl;
exit(0);
}
return 0;
}
然后我希望这个运行如下:
inside
,但我得到的是这个结果:
inparent
shashish-vm@shashishvm-VirtualBox:~/Desktop$ inchild
read bytes: 0
child(read) inside descriptor:
A��M�N��sf�
in child's end
它仍然没有终止。
我在Oracle VM VirtualBox(32位O.S.)上使用Ubuntu 14.04 LTS。我不知道它为什么这样做。我知道调度程序的工作是切换进程,但IPC的管道功能仍然没有在那里工作。即使我删除了close(af[0])
语句,但仍然没有正确地进行读取,写入过程也会发生。
答案 0 :(得分:2)
问题是你在调用fork后打开管道。这意味着父母和孩子有不同的管道。您可以通过在fork之前将调用移动到管道来创建单个链接管道来修复它。