如何解决如何使用管道向子进程发送标志?
我需要编写一个程序,它要求输入一个整数,将输入通过管道传输到子进程,在子进程内部取平方,再通过管道返回父进程,然后再请求另一个输入。
我可以在没有循环的情况下做到这一点,但是我终生无法弄清楚我需要调用 fork() 和 read() 的顺序。
这是我所拥有的:
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void){
int psocket[2];
int csocket[2];
int csig[2];
int sig = 0;
pid_t child;
if(read(csig[0],&sig,sizeof(int)) == -1)
perror("reading signal");
if(sig){
int square;
if(read(csocket[0],&square,sizeof(int))==-1)
perror("read to child");
square = square * square;
if(write(psocket[1],sizeof(int))==-1)
perror("write to parent");
return 0;
}
while(1){
int value;
sig = 1;
printf(">> ");
scanf("%d",&value);
if(value ==0)
break;
if(write(csocket[1],&value,sizeof(int))==-1)
perror("write to child");
if(write(csig[1],sizeof(int))==-1)
perror("write to signal");
child = fork();
wait(NULL);
if(read(psocket[0],sizeof(int))==-1)
perror("read to parent");
printf("\n>> %d\n",value);
}
return 0;
}
但是我在尝试读/写 csig 管道时出错
reading signal: Bad file descriptor
>> 32 //entering a value to test
write to signal: Bad file descriptor
此时我完全迷失了。有没有其他方法可以解决这个问题?很明显我做错了什么?
编辑:
我发现我忘记调用 pipe()
我添加了
if ((pipe(psocket) < 0) || (pipe(csocket) < 0) || (pipe(csig) < 0)) {
perror("opening stream socket pair");
exit(10);
}
在变量初始化之后,现在程序挂起。
解决方法
我意识到我可以递归调用 main() 进程,问题解决了
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void){
int psocket[2];
int csocket[2];
pid_t child;
if(pipe(psocket) < 0 || pipe(csocket) < 0)
perror("pipe");
child = fork();
if(child < 0)
perror("fork");
if(child == 0){
int value = 0;
if(read(csocket[0],&value,sizeof(int)) < 0)
perror("read child");
value = value * value;
if(write(psocket[1],sizeof(int)) < 0)
perror("write parent");
}
else if (child){
int value = 0;
printf(">> ");
scanf("%d",&value);
if(write(csocket[1],sizeof(int)) < 0)
perror("write child");
wait(NULL);
if(read(psocket[0],sizeof(int)) < 0)
perror("read parent");
printf("Squared: %d\n",value);
main();
}
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。