您的主要问题是您需要
dup2()反转参数。您需要使用:
dup2(fd_p2c[0], 0); // Duplicate read end of pipe to standard inputdup2(fd_pFc[1], 1); // Duplicate write end of pipe to standard output
我陷入了误读您写为OK的错误的念头,直到我对设置代码进行错误检查并从
dup2()调用中获得了意外的值,这告诉我出了什么问题。如果出现问题,请插入之前跳过的错误检查。
您也没有确保从子级读取的数据为空终止;此代码可以。
工作代码(带有诊断程序),使用
cat最简单的“其他命令”:
#include <unistd.h>#include <string>#include <iostream>using namespace std;int main(){ int fd_p2c[2], fd_c2p[2], bytes_read; pid_t childpid; char readbuffer[80]; string program_name = "/bin/cat"; string gulp_command = "this is the command data sent to the child cat (kitten?)"; string receive_output = ""; if (pipe(fd_p2c) != 0 || pipe(fd_c2p) != 0) { cerr << "Failed to pipen"; exit(1); } childpid = fork(); if (childpid < 0) { cout << "Fork failed" << endl; exit(-1); } else if (childpid == 0) { if (dup2(fd_p2c[0], 0) != 0 || close(fd_p2c[0]) != 0 || close(fd_p2c[1]) != 0) { cerr << "Child: failed to set up standard inputn"; exit(1); } if (dup2(fd_c2p[1], 1) != 1 || close(fd_c2p[1]) != 0 || close(fd_c2p[0]) != 0) { cerr << "Child: failed to set up standard outputn"; exit(1); } execl(program_name.c_str(), program_name.c_str(), (char *) 0); cerr << "Failed to execute " << program_name << endl; exit(1); } else { close(fd_p2c[0]); close(fd_c2p[1]); cout << "Writing to child: <<" << gulp_command << ">>" << endl; int nbytes = gulp_command.length(); if (write(fd_p2c[1], gulp_command.c_str(), nbytes) != nbytes) { cerr << "Parent: short write to childn"; exit(1); } close(fd_p2c[1]); while (1) { bytes_read = read(fd_c2p[0], readbuffer, sizeof(readbuffer)-1); if (bytes_read <= 0) break; readbuffer[bytes_read] = ' '; receive_output += readbuffer; } close(fd_c2p[0]); cout << "From child: <<" << receive_output << ">>" << endl; } return 0;}样本输出:
Writing to child: <<this is the command data sent to the child cat (kitten?)>>From child: <<this is the command data sent to the child cat (kitten?)>>
请注意,您将需要小心以确保不会陷入代码僵局。如果您具有严格的同步协议(因此父级写一条消息并以锁步方式读取响应),则应该没问题,但如果父级正在尝试写一个太大而无法放入子级管道的消息当孩子试图写一条太大的消息而无法放入父级管道中时,则每个消息都将被阻止写入,而等待对方阅读。



