これは私がやろうとしていることです。親プロセスは2つの子プロセスを作成し、次にstdoutを1つずつstdoutして別のstdinにします。親は5秒待って最初の子を殺します。パイプ内の他の子のstdinへのパイプ
これが私のアプローチです。まずパイプを作成します。次にforkを実行して最初の子(gen in code)を作成し、dup2を使用してpipeのwriteをstdoutにコピーします。 2番目の子の別のフォーク(コードではconsと呼ばれます)、dup2はread endをstdinに複製します。短所はデータを印刷するだけです。親はSIGTERMを最初の子に送り、2番目の子はEOFまで読み込んで、自身の上で閉じます。
私のエラー出力(ここではデバッグに使用)は表示されません。 Genは2つの乱数を生成しますが、consのループは実行されません。だから、私は、短所には何もないと思う。 私はGoogleに相談し、これに続いてHow do I chain stdout in one child process to stdin in another child in C?と言っていたが、私がどんなことをするのか分からなかった。助けていただければ幸いです。おかげ
編集:Windowsの10でのバッシュのgcc -std=c99 -Wall -Werror main.c -o main
コード:
#define _POSIX_SOURCE
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <signal.h>
#define READ_END 0
#define WRITE_END 1
#define BUF_SIZE 10
int main(int argc, char* argv[])
{
pid_t gen, cons;
int fd[2];
if (pipe(fd) < 0) {
// pipe error
exit(1);
}
gen = fork();
if (gen < 0) {
// fork error
close(fd[READ_END]);
close(fd[WRITE_END]);
exit(2);
} else if (gen == 0) {
// gen child
close(fd[READ_END]);
time_t t;
srand((unsigned)time(&t));
dup2(fd[WRITE_END], STDOUT_FILENO);
close(fd[WRITE_END]);
while(1) {
int a = rand() % 1000;
int b = rand() % 1000;
printf("gen %d %d\n", a, b);
fprintf(stderr, "err, gen %d %d\n", a, b);
sleep(1);
}
}
else {
cons = fork();
if (cons < 0) {
// fork error
close(fd[READ_END]);
close(fd[WRITE_END]);
kill(gen, SIGKILL);
exit(2);
} else if (cons == 0) {
// cons child
close(fd[WRITE_END]);
dup2(fd[READ_END], STDIN_FILENO);
close(fd[READ_END]);
char line[BUF_SIZE];
while (fgets(line, sizeof(line), stdin)) {
printf("cons received: %s\n", line);
fprintf(stderr, "cons lives!\n");
}
} else {
// parent
close(fd[READ_END]);
close(fd[WRITE_END]);
sleep(5);
kill(gen, SIGTERM);
}
}
return 0;
}
ありがとう –