栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

输入/输出管道

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

输入/输出管道

您的主要问题是您需要

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?)>>

请注意,您将需要小心以确保不会陷入代码僵局。如果您具有严格的同步协议(因此父级写一条消息并以锁步方式读取响应),则应该没问题,但如果父级正在尝试写一个太大而无法放入子级管道的消息当孩子试图写一条太大的消息而无法放入父级管道中时,则每个消息都将被阻止写入,而等待对方阅读。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/371015.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号