C-在不同工艺中使用不同的管端
我一直在搜索和阅读手册,但仍然无法获得管道机制。我正在制作一个程序,该程序应执行以下操作:C-在不同工艺中使用不同的管端,c,linux,pipe,system-calls,dup2,C,Linux,Pipe,System Calls,Dup2,我一直在搜索和阅读手册,但仍然无法获得管道机制。我正在制作一个程序,该程序应执行以下操作: 父进程创建管道,两个子进程并等待 第一个子进程生成成对的随机数,并通过管道将它们以空格形式传递给第二个进程。一直持续到 从父级获取信号 第二个子对象重定向其输入,使其成为第一个子对象的输出,并将输出重定向到out.txt文件。然后它执行 已编译程序,计算(1)中数字的GCD 父对象关闭管道并杀死子对象 所以我得到了这个C代码(我减少了它,这样帖子就可以符合规则): const int PIPE\u RE
const int PIPE\u READEND=0;
管道内常数=1;
(...)
如果(child1==0){
//这里是Child1代码
关闭(fd[1]);
struct-sigaction-sa;
sa.sa_handler=sigHandler;
sigemptyset(和sa.sa_面具);
sa.sa_标志=0;
if(sigaction(SIGUSR1,&sa,NULL)==-1){//处理SIGUSR1信号
perror(“信号处理意外错误”);
出口(errno);
}
INTA,b;
srand(time&t));
if(dup2(fd[PIPE_READEND],1)<0){//将标准输出重定向到管道fd。
perror(“在Child1中将标准输出重定向到管道错误”);
出口(errno);
}
关闭(fd[0]);
而(1){
a=兰德();
b=兰德();
printf(“%d%d\n”,a,b);
睡眠(1);
}
(...)
如果((child2=fork())<0){
perror(“Child2过程中的Fork错误”);
出口(errno);
}else if(child2==0){
//这里是Child2代码
关闭(fd[管道读取端]);
文件*outfile=fopen(“out.txt”,“w”);
dup2(fd[PIPE_WRITEEND],0);
dup2(输出文件,1);
关闭(fd[管道写入]);
execl(“c1/main”、“main”、“char*)NULL);
问题是,在执行它之后,out.txt仍然是空的。我对管道数组索引感到失望,哪一个用于什么
FILE *outfile = fopen("out.txt","w");
dup2(fd[PIPE_WRITEEND],0);
dup2(outfile,1);
这没有任何意义。
dup2
函数没有将文件*
作为参数。使用open
,而不是fopen
从错误的管道索引中写入和读取。您需要更改它们:
这会将标准输出重定向到管道输入
close(fd[0]);
dup2(fd[1], STDOUT_FILENO);
这会将管道输出重定向到标准输入
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
另外,dup2
接受整数,而不是指针,因此您应该执行以下操作:
f = fopen("out.txt", "w");
dup2(fileno(f), STDOUT_FILENO);
@Stargateur Emm,谢谢,仍然是空的。但是,我注意到了一件事。在
execl()
命令中执行的程序在完成时向stdout提示“完成”。我的程序在完成时提示“终止”。并且“完成”出现在“终止”之前,因此execl()
不知何故没有等待主程序及其编号。虽然看不到修复的方法。@DavidSchwartz谢谢你的建议。我对它做了一点修改,但还是遇到了同样的问题。int fdOut=open(“out.txt”,O_WRONLY | O| create | O| TRUNC,S|irsr | S| IWUSR | S| IRGRP | S| IROTH);dup2(fdOut,1)//将输出重定向到“out.txt”关闭(fd[PIPE_WRITEEND]);execl(“c1/main”,“main”,“char*)NULL);观察错误可能在哪里?就像我们没有你的其他程序的代码一样。我们帮不了你更多。你有很多奇怪的代码。例如,你用PIPE[0]替换了1。这是无用的,因为在管道出口处写入不起作用。我不明白您为什么要使用信号。您需要从读取端读取,然后写入到写入端。您正在从写入端读取,然后写入到读取端。
f = fopen("out.txt", "w");
dup2(fileno(f), STDOUT_FILENO);