C-使用dup将标准输出重定向到execl(二进制文件)';s输入
我需要以下程序的帮助,应该是分叉两个孩子, 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部分似乎没有按我的预期工作。任何帮助都将不胜感激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。但
#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)代码>