gpt4 book ai didi

c - C 中的多管道

转载 作者:行者123 更新时间:2023-11-30 14:28:01 24 4
gpt4 key购买 nike

我正在尝试用 C 实现多个管道,解决方案应该是:

cmd1 | cmd2 | cmd3

以及:

        |--- cmd2

cmd1 |--- cmd3

|--- cmd4
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <signal.h>

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

char* args1[] = { "ls", NULL, NULL };
char* args2[] = { "ls", "-l", NULL };
char* args3[] = { "sort", NULL, NULL };
char* args4[] = { "wc", "-l", NULL };

int rc1 = execute_cmd(args1, 0);
//printf("rc1 = %d\n", rc1);

int rc2 = execute_cmd(args2, rc1);
//printf("rc2 = %d\n", rc2);

int rc3 = execute_cmd(args3, rc1);
//printf("rc3 = %d\n", rc3);

int rc4 = execute_cmd(args4, rc1);
//printf("rc4 = %d\n", rc4);

int buffer[1024];
int len = 0;

if (rc2) {
while ((len = read(rc2, buffer, sizeof(buffer))) > 0) {
write(STDERR_FILENO, "rc2\n", 4);
write(STDERR_FILENO, &buffer, len);
}
} else {
printf(stderr, "ERROR\n");
}

if (rc3) {
while ((len = read(rc3, buffer, sizeof(buffer))) > 0) {
write(STDERR_FILENO, "rc3\n", 4);
write(STDERR_FILENO, &buffer, len);
}
} else {
printf(stderr, "ERROR\n");
}

if (rc4) {
while ((len = read(rc4, buffer, sizeof(buffer))) > 0) {
write(STDERR_FILENO, "rc4\n", 4);
write(STDERR_FILENO, &buffer, len);
}
} else {
printf(stderr, "ERROR\n");
}

return 0;
}

int execute_cmd(char** args, int fd_in) {

int pipefd[2];
pipe(pipefd);

if (fork() == 0) {
close(pipefd[0]);

dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);

close(pipefd[1]);

if (fd_in) {
dup2(fd_in, 0);
}

execvp(*args, args);
printf("failed to execute %s %s", *args, *args[0]);
} else {
close(pipefd[1]);

return pipefd[0];

}
}

程序的输出是不确定的,一旦我看到正确的结果,一旦我看到不同的结果。看起来 dup2 没有按我的预期运行,如果我多次 dup2 并且对于从结果文件描述符读取的每个文件描述符 - 看起来它对复制的文件描述符有影响?

如果按照我提到的设计工作,我需要使用哪个系统调用?

最佳答案

是的,dup 和 dup2 为同一管道创建完全等效的句柄。如果多个进程(或线程)同时尝试使用重复/ fork 描述符从管道中读取数据,则它们中的“随机”将首先获取数据,但写入管道的每个字节仅传递一次。

如果您想将数据复制到多个不同的读取器,则必须显式编程 - fork 一个子进程(或生成一个线程)以从一个传入管道读取一些数据,然后将其写入所有传出管道,并继续循环直到到达 EOF。

关于c - C 中的多管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6970980/

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