Я искал и читал руководства, но все еще не могу получить механизм трубы. Я делаю программу, которая должна делать следующее:C - использование различных концов труб в разных проходах
Родительский процесс создает трубу, два дочерних процесса и ждет.
- Первый ребенок генерирует пары случайных чисел и передает их промежутком между вторым процессом через трубу. Он продолжается до получает сигнал от родителя.
- Второй ребенок перенаправляет его на вход, поэтому он является выходным из первого дочернего элемента и перенаправляет вывод в файл out.txt. Затем он выполняет уже скомпилированную программу, вычисляя GCD чисел из (1);
Родитель закрывает трубку и убивает ребенка.
Так что я получил этот код С (я уменьшил его так, чтобы пост может соответствовать правилам):
const int PIPE_READEND=0;
const int PIPE_WRITEEND=1;
(...)
if (child1 == 0) {
//Child1 code here
close(fd[1]);
struct sigaction sa;
sa.sa_handler = sigHandler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGUSR1,&sa,NULL) == -1){ //Handling SIGUSR1 signal
perror("Signal handling unexpected error");
exit(errno);
}
int a,b;
srand(time(&t));
if (dup2(fd[PIPE_READEND],1) < 0){ //Redirecting stdout to the pipe fd.
perror("In Child1 Redirecting stdout to pipe error");
exit(errno);
}
close(fd[0]);
while(1){
a = rand();
b = rand();
printf("%d %d\n", a, b);
sleep(1);
}
(...)
if ((child2 = fork()) < 0){
perror("Fork error in Child2 process");
exit(errno);
} else if (child2 == 0){
//Child2 code here
close(fd[PIPE_READEND]);
FILE *outfile = fopen("out.txt","w");
dup2(fd[PIPE_WRITEEND],0);
dup2(outfile,1);
close(fd[PIPE_WRITEEND]);
execl("c1/main","main",(char *)NULL);
Проблема заключается в том, после его выполнения, out.txt остается пустым. Я разочарован индексами массива труб, который используется для чего.
Как мы не имеем код другой программы. Мы не можем больше вам помочь. У вас много странного кода. Например, вы заменяете 1 по трубе [0]. Это бесполезно, потому что запись на выходе из трубы не работает. Я не понимаю, почему вы хотите использовать сигнал. – Stargateur
Вам нужно прочитать с конца чтения и записать в конец записи. Вы читаете с конца записи и записываете в конец чтения. – alvits