gpt4 book ai didi

c - 流水线来自同一 parent 的多个 child

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:31 24 4
gpt4 key购买 nike

早上好,我已经与这种方法“斗争”了很长时间,最后我决定寻求帮助,因为我不明白我做错了什么。我正在尝试从同一父项创建多个子项,并以这种方式将“子项 1”的 STDOUT 设为“子项 2”的 STDIN,直到不再有像管道这样的子项为止。

我的实际代码

void filter(void) {

if(Number_cmd != 0) {

int p,i;
int fd[2];

for(i=0;i<Number_cmd;i++)
pipe(fd);

for(p=(Number_cmd-1); p>=0; p--){
switch(fork()) {
case -1:
perror("fork");
exit(1);
case 0:
/* Child */
close(fd[1]);
close(0);
dup(fd[0]);
close(fd[0]);

execlp(filter[p], filter[p], NULL);
perror("exec");
exit(1);
default:
/* Father */
close(fd[0]);
close(1);
dup(fd[1]);
close(fd[1]);
break;
}
}
}
}

void directory(char* directory_name) {

DIR* dir = NULL;
struct dirent* ent;
char fich[1024];
char buff[4096];
int fd, reading;
struct stat sdata;

dir = opendir(directory_name);

while((ent=readdir(dir))!=NULL) {
if(ent->d_name[0]=='.')
continue;

fich[0]='\0';
strcat(fich, directory_name);
strcat(fich, "/");
strcat(fich, ent->d_name);
stat(fich,&sdata);

if(S_ISDIR(sdata.st_mode))
continue;

fd = open(fich, O_RDONLY);

while((reading= read(fd, buff, 4096)) > 0){
(write(1, buff, reading) < reading);
continue;
}
close(fd);
}
closedir(dir);
}

问题是当我尝试使用多个命令调用该方法时,看起来 ii 什么也没做,但是当我使用一个命令运行它时工作正常。提前谢谢大家。 (对不起我的英语;这不是我的母语)

编辑

这是主要方法:

char** cmd;
int Number_cmd;

int main(int argc, char* argv[]){

cmd = &(argv[2]); /*list of the commands*/
Number_cmd = argc-2; /* number of commands*/

filter();
directory(argv[1]);
return 0;
}

最佳答案

问题一:

  for(i=0;i<Number_cmd;i++)
pipe(fd);

除非变量 Number_cmd 为 1(或更小),否则您会疯狂地泄漏管道描述符。您需要某种文件描述符数组:

int fds[Number_cmd][2];

for (int i = 0; i < Number_cmd; i++)
if (pipe(fd[i]) != 0)
…report error and abandon ship (remembering to close any opened pipes)…

问题2:

这主要是问题 1 的结果——但您没有关闭足够多的文件描述符。本质上,如果您打开了 N 个管道,您的 child 将在将两个文件描述符复制到标准输入和标准输出之后最终关闭 2*N 个文件描述符。第一个和最后一个 child 会不同;它们不会分别覆盖标准输入和标准输出。

可能还有其他问题,但是通过相当快速地查看代码立即想到这两个问题。

关于c - 流水线来自同一 parent 的多个 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22549006/

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