管道在父子进程中无法正常工作

时间:2014-06-26 13:14:00

标签: c++ linux fork pipe

由于我刚刚开始使用这些概念,我可能会遗漏一些基本的东西。我试图使用管道链接父进程和子进程(由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;

}

然后我希望这个运行如下:

  • 进入父母 - &gt;写字符串,
  • 关闭写结束,
  • 进入孩子 - &gt;将字符串读入inside
  • 显示字符串(Hello World)的结果,
  • 关闭阅读结束。

但我得到的是这个结果:

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])语句,但仍然没有正确地进行读取,写入过程也会发生。

1 个答案:

答案 0 :(得分:2)

问题是你在调用fork后打开管道。这意味着父母和孩子有不同的管道。您可以通过在fork之前将调用移动到管道来创建单个链接管道来修复它。