C - использование dup для перенаправления stdout на ввод execl(бинарный файл)

Мне нужна помощь со следующей программой. Предполагается, что fork() двух дочерних процессов, child1 должен отправить два случайных числа, в строке, разделенных пробелом, через канал child2, подождать 1 секунду и сделать это снова, пока не получит SIGUSR1 от родителя (родитель отправляет его через 5 секунд). child2 должен запустить двоичный файл main.exe, перенаправить вывод канала на вход main.exe и перенаправить вывод main.exe в файл out.txt. Двоичный файл main.exe прекрасно работает сам по себе и находится в папке приложения.

Это школьная домашняя работа. Мне удалось отправить строки из child1 в child2, используя функции записи и чтения. Но часть домашней работы заключается в том, что каждый раз, когда я перенаправляю выводы или входы, я должен использовать функцию dup(int a, int b). Также я должен сделать child1? Принять? SIGUSR1, использующий sigaction,(когда он получен, потомок 1 должен напечатать 'TERMINATED' на stderr и завершить работу) -> я не знаю, как это сделать. Программа завершается успешно, но, похоже, ничего не делает, часть printf в child1, кажется, не работает так, как я планировал. Любая помощь будет принята с благодарностью.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() {
    int fd[2];
    pipe(fd);
    pid_t pid1 = fork();
    struct timespec tim1, tim5;
    tim1.tv_sec = 1;
    tim1.tv_nsec=0;
    tim5.tv_sec = 5;
    tim5.tv_nsec=0;
    if (pid1 > 0) {
        pid_t pid2 = fork();
        if (pid2 > 0) {
            close(fd[0]);
            close(fd[1]);
            nanosleep(&tim5, (struct timespec *) NULL);
            kill(pid1, SIGUSR1);
            int status;
            wait(&status);
        } else if (!pid2) {
            execl("main.exe","main", (char*) 0);
            close(fd[1]);
            char *buf;
            if((buf = malloc(23))==NULL){
                return 3;
            }            
            mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
            int file = open("out.txt", O_WRONLY | O_CREAT | O_TRUNC, mode);            
            ssize_t bytesread;
            while ((bytesread=read(fd[0], buf, 22)) > 0) {
                buf[bytesread] = '\0';
                printf("%s\n", buf);
            }
            //^redirect pipe output to the main.exe's input and then redirect main.exe's output to out.txt text file^
        } else {
            return 2;
        }
    } else if (!pid1) {
        close(fd[0]);
        int a, b;
        dup2(fd[1], STDOUT_FILENO);
        while (1) {//child 1 should write to stderr "TERMINATED" if SIGUSR1 is received, and terminate 
            a = rand();
            b = rand();
            printf("%d %d\n", a, b);
            nanosleep(&tim1, (struct timespec *) NULL);
        }
    } else {
        return 1;
    }
    return 0;
}

0 ответов

Другие вопросы по тегам