Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用管道通过文件在父级和子级之间共享数据?_C++_Pipe_Dup2 - Fatal编程技术网

C++ 如何使用管道通过文件在父级和子级之间共享数据?

C++ 如何使用管道通过文件在父级和子级之间共享数据?,c++,pipe,dup2,C++,Pipe,Dup2,我知道父母和孩子可以使用共享内存或通过套接字进行通信。我试着让他们用管道互相沟通 我首先使用fork创建了一个子系统,我最终希望子系统从父系统输出的stdout读取消息,但我无法做到这一点,所以我试图让它们通过临时文件进行通信 在fork之后,我使用dup2将该文件设置为子文件的输入fd和父文件的输出fd。然后使用睡眠,我确保孩子在父母输出后阅读 #include<bits/stdc++.h> #include<sys/types.h> #include<sys/w

我知道父母和孩子可以使用共享内存或通过套接字进行通信。我试着让他们用管道互相沟通

我首先使用fork创建了一个子系统,我最终希望子系统从父系统输出的
stdout
读取消息,但我无法做到这一点,所以我试图让它们通过临时文件进行通信

fork
之后,我使用
dup2
将该文件设置为子文件的输入fd和父文件的输出fd。然后使用睡眠,我确保孩子在父母输出后阅读

#include<bits/stdc++.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

using namespace std;

int main(int argc, char**  argv){
    if(argc<2){
        printf("Usage: %s <string>\n", argv[0]);
        return 0;
    }
    int raw_desc = open("/tmp/raw.txt",O_RDWR);
    if(raw_desc<0){
        FILE* fptr = fopen("/tmp/raw.txt", "a+");
        raw_desc = open("/tmp/raw.txt",O_RDWR);
    }
    int f=fork();
    if(f==0){
        dup2(raw_desc, 0);
        sleep(3);
        string s;
        cin>>s;
        cout<<"Child got : "<<s<<endl;
    }else{
        dup2(raw_desc, 1);
        sleep(1);
        cout<<std::string(argv[1])<<endl;
        wait(NULL);
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv){
if(argcs;
库特
首先,我使用fork创建了一个子系统,最后我希望子系统从stdout读取消息,该消息将由父系统输出,但我无法做到这一点,所以我试图让它们通过临时文件进行通信

通过使用
pipe
dup2
很容易实现这一点

下面是如何使用管道连接父对象的标准输出和子对象的标准输入的示例

家长:

intfd[2];
管道(fd);
int saved_stdout=dup(1);//可能您希望保存stdout fd并稍后恢复它
dup2(fd[1],1);//父级:写入fd[1]
//写作
dup2(已保存的标准输出,1);//还原标准输出
孩子:

int saved\u stdin=dup(0);
dup2(fd[0],0);//子级:从fd[0]读取
//读书
dup2(已保存的标准输入,0);//还原标准输入
首先,我使用fork创建了一个子系统,最后我希望子系统从stdout读取消息,该消息将由父系统输出,但我无法做到这一点,所以我试图让它们通过临时文件进行通信

通过使用
pipe
dup2
很容易实现这一点

下面是如何使用管道连接父对象的标准输出和子对象的标准输入的示例

家长:

intfd[2];
管道(fd);
int saved_stdout=dup(1);//可能您希望保存stdout fd并稍后恢复它
dup2(fd[1],1);//父级:写入fd[1]
//写作
dup2(已保存的标准输出,1);//还原标准输出
孩子:

int saved\u stdin=dup(0);
dup2(fd[0],0);//子级:从fd[0]读取
//读书
dup2(已保存的标准输入,0);//还原标准输入

明白了。编辑。@kaleid\u-liner你得到了我的投票,但我删除了你的问题。明白了。编辑。@kaleid\u-liner你得到了我的投票,但我删除了你的问题。不要做
#包含
-只包含你使用的内容。该标题是非标准的。