私は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が期待どおりに機能しないように見えます-コピーされたファイル記述子に影響を与えているように見えますか?
私が設計で述べたように機能する場合、両方に使用する必要があるシステムコールはどれですか?