gpt4 book ai didi

pipe - 在 C++ 中使用 pipe() 管道管道

转载 作者:行者123 更新时间:2023-11-28 03:41:05 26 4
gpt4 key购买 nike

我目前正在尝试连接父项和子项之间的管道。子级正在执行 sort 并对从父级接收到的输入进行排序。然后 children 写入一个单独的管道。每个进程有两个管道。一个这样 parent 可以将输入发送给 child 。另一个这样父级可能会收到排序结果。

到目前为止,我的问题一直是读取输入。我已从 fputs() 得到确认,我已成功写入 child 的输入。之后,我 fflush(NULL) 并尝试读取 child 的输出。读取 block ,因为它从不返回或到达 fputs 之后的语句。这很奇怪,因为我相信我已将读取设置为 O_NONBLOCK。下面列出了输出。

line 174 
line 176
line 178

这是一段代码:

int sort_writes[num_sort][2];
int sort_reads[num_sort][2];
int i;
int *status;
int flags;
char buffer[BUFFER_SIZE];
// this should contain a bunch of write fds wrapped in fdopen
FILE* to_sort[num_sort];
// the same except with reads
FILE* from_sort[num_sort];
//this only include for simplicity and so that exec will happen proper
char *sort_argv[2];
sort_argv[0]=(char*)"sort";
sort_argv[1]= (char *)NULL;

// This will create all of the pipes for the sorts.
// The parent will read 0 and the even pipes. it will write to the odd.
for(i=0; i< num_sort; i++){
//parent reads from this pipe. child writes to it.
assert(pipe(sort_writes[i]) == 0);

//parent write to this pipe. child reads from it.
assert(pipe(sort_reads[i]) ==0);
switch(fork()){
case 0: //this is the child
//this closes unnecessary fds
_close_less_than(i, sort_writes);
_close_less_than(i, sort_reads);
dup2(sort_reads[i][0], STDIN_FILENO);
// standard out becomes parent pipe in
dup2(sort_writes[i][1], STDOUT_FILENO);
execv(SORT_LOC.c_str(), sort_argv);
default: // this the parent.
//clean up. close unused.
close(sort_writes[i][1]);
close(sort_reads[i][0]);
}

}
//Creates a file pointer for all of the fds I will use to communicate with my sorts
//It also sets all reads to nonblock and the parent write stdio buffers to zero.
for(i=0; i< num_sort; i++){
assert((from_sort[i]= fdopen(sort_writes[i][0] ,"r")) != NULL);
assert((to_sort[i]= fdopen(sort_reads[i][1] , "w")) != NULL); //pipes ignore truncate

flags = fcntl(sort_writes[i][0], F_GETFL);
flags |= O_NONBLOCK;
fcntl(sort_writes[i][0], F_SETFL, flags);


}

for(i=0; i<(int)theArray.size(); i++){
fputs(theArray.back().c_str(), to_sort[i % num_sort]);
theArray.pop_back();
fflush(NULL); // so that the data gets from stdio buffers to pipe buffers.
}
cout << "line 174 \n";
for(i=0; i <1; i++){
cout << "line 176 \n";
while(!feof(from_sort[i])){
cout << "line 178 \n";
cout << fgets(buffer, BUFFER_SIZE, from_sort[i]);
cout << buffer;
cout << "at least i tried \n";
}

最佳答案

exec 之前,您忘记了 dup2close。对于您的代码,sort 不知道将哪个文件描述符用于什么。我不知道 _close_less_than 做了什么,但如果它关闭了描述符 0、1 或 2,那么你将在它无法理解的环境中调用 sort。您必须将管道连接到 child 的标准输入和标准输出。

关于pipe - 在 C++ 中使用 pipe() 管道管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com