C-使用dup将标准输出重定向到execl(二进制文件)';s输入

C-使用dup将标准输出重定向到execl(二进制文件)';s输入,c,pipe,dup,execl,sigaction,C,Pipe,Dup,Execl,Sigaction,我需要以下程序的帮助,应该是分叉两个孩子, child1应将两个随机数以空格分隔的字符串形式发送到child2槽管,等待1秒,然后再次发送,直到收到来自父级的SIGUSR1(父级在5秒后发送)。 child2应该运行“main.exe”二进制文件,将管道的输出重定向到main.exe的输入,并将main.exe的输出重定向到out.txt文件。 main.exe二进制文件本身工作正常,它位于应用程序文件夹中 这是学校的家庭作业。我已经设法使用写和读函数将字符串从child1发送到child2。但

我需要以下程序的帮助,应该是分叉两个孩子, child1应将两个随机数以空格分隔的字符串形式发送到child2槽管,等待1秒,然后再次发送,直到收到来自父级的SIGUSR1(父级在5秒后发送)。 child2应该运行“main.exe”二进制文件,将管道的输出重定向到main.exe的输入,并将main.exe的输出重定向到out.txt文件。 main.exe二进制文件本身工作正常,它位于应用程序文件夹中

这是学校的家庭作业。我已经设法使用写和读函数将字符串从child1发送到child2。但作业的一部分是,每次重定向输出或输入时,我必须使用dup(intA,intB)函数。 我也应该让孩子接受?使用sigaction的SIGUSR1(当它被接收时,子1应该在stderr上打印'TERMINATED'并终止)->我不知道怎么做。程序成功完成,但似乎没有做任何事情,child1中的printf部分似乎没有按我的预期工作。任何帮助都将不胜感激

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
int-fd[2];
管道(fd);
pid_t pid1=fork();
结构timespec tim1、tim5;
tim1.tv_sec=1;
tim1.tv_nsec=0;
tim5.tv_sec=5;
tim5.tv_nsec=0;
如果(pid1>0){
pid_t pid2=fork();
如果(pid2>0){
关闭(fd[0]);
关闭(fd[1]);
nanosleep(&tim5,(struct timespec*)NULL);
kill(pid1,SIGUSR1);
智力状态;
等待(&状态);
}如果(!pid2){
execl(“main.exe”,“main”,“char*)0);
关闭(fd[1]);
char*buf;
如果((buf=malloc(23))==NULL){
返回3;
}            
模式=S|u IRUSR | S|u IWUSR | S|u IRGRP | S|IROTH;
int file=open(“out.txt”,O_WRONLY | O_CREAT | O_TRUNC,mode);
用字节读;
而((bytesread=read(fd[0],buf,22))>0){
buf[bytesread]='\0';
printf(“%s\n”,buf);
}
//^将管道输出重定向到main.exe的输入,然后将main.exe的输出重定向到out.txt文本文件^
}否则{
返回2;
}
}如果(!pid1){
关闭(fd[0]);
INTA,b;
dup2(fd[1],标准文件号);
而(1){//如果接收到SIGUSR1,则子1应向stderr写入“TERMINATED”,并终止
a=兰德();
b=兰德();
printf(“%d%d\n”,a,b);
nanosleep(&tim1,(struct timespec*)NULL);
}
}否则{
返回1;
}
返回0;
}

需要注意的几点:1)
fork()
有三个返回条件:0表示父进程。代码需要处理这三种情况。2) 除非函数失败,否则任何
exec…()
函数都不会返回,因此如果返回,则执行两条语句:`peror(“exec..failed”);退出(退出失败);如果没有其他的
sleep()
被贬低,请使用
nanosleep()
或类似的函数建议发布
main.exe的源代码请务必阅读/理解代码调用的系统函数。例如,
execl()
的语法是:
intexecl(constchar*path,constchar*arg,…/*(char*)NULL*/)
这意味着调用应该更像:
execl(“main.exe”,“main”,NULL)只需在子级中执行一次,而不是每次都通过循环执行:
dup2(文件,STDOUT\u FILENO)