linux 父子进程通信问题 35
我想通过管道进行父子进程通信,子进程执行一个a.out程序,我需要把a.out的输出信息读到父进程的buff里,可是我的程序里,父进程的read函数一直阻塞,为什么。(如...
我想通过管道进行父子进程通信,子进程执行一个a.out程序,我需要把a.out的输出信息读到父进程的buff里,可是我的程序里,父进程的read函数一直阻塞,为什么。(如果a.out中不加sleep,一切都正常,加了就阻塞)代码如下
if((pid = fork()) < 0) {
(void)close(fd[0]);
(void)close(fd[1]);
logPrint(DIRLOG("fork error"));
}else if(pid == 0) {//child
dup2(fd[1], STDOUT_FILENO); //fd[1]作为标准输出
close(fd[1]);
close(fd[0]);
if(-1 == setsid()) {
perror("setsid error:");
}
if(-1 == execvp("a.out", NULL)) {//执行程序
printf("execvp == -1\n");
}
exit(0);
}else {//parent
if(1 != backFlag) {
close(fd[1]);
while(1) {
memset(buff, 0, sizeof(buff));
readNum = read(fd[0], buff, 1024);//一直阻塞
if(readNum <= 0) {
break;
}
}
close(fd[0]);
waitpid(pid, NULL, WUNTRACED);
}
}
//a.out
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int i=0;
while(1) {
i++;
printf("%d\n",i);
sleep(1);
}
}
if((pid = fork()) < 0) {
(void)close(fd[0]);
(void)close(fd[1]);
logPrint(DIRLOG("fork error"));
}else if(pid == 0) {//child
dup2(fd[1], STDOUT_FILENO); //fd[1]作为标准输出
close(fd[1]);
close(fd[0]);
if(-1 == setsid()) {
perror("setsid error:");
}
if(-1 == execvp("a.out", NULL)) {//执行程序
printf("execvp == -1\n");
}
exit(0);
}else {//parent
close(fd[1]);
while(1) {
memset(buff, 0, sizeof(buff));
readNum = read(fd[0], buff, 1024);//一直阻塞
if(readNum <= 0) {
break;
}
}
close(fd[0]);
waitpid(pid, NULL, WUNTRACED);
} 展开
if((pid = fork()) < 0) {
(void)close(fd[0]);
(void)close(fd[1]);
logPrint(DIRLOG("fork error"));
}else if(pid == 0) {//child
dup2(fd[1], STDOUT_FILENO); //fd[1]作为标准输出
close(fd[1]);
close(fd[0]);
if(-1 == setsid()) {
perror("setsid error:");
}
if(-1 == execvp("a.out", NULL)) {//执行程序
printf("execvp == -1\n");
}
exit(0);
}else {//parent
if(1 != backFlag) {
close(fd[1]);
while(1) {
memset(buff, 0, sizeof(buff));
readNum = read(fd[0], buff, 1024);//一直阻塞
if(readNum <= 0) {
break;
}
}
close(fd[0]);
waitpid(pid, NULL, WUNTRACED);
}
}
//a.out
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int i=0;
while(1) {
i++;
printf("%d\n",i);
sleep(1);
}
}
if((pid = fork()) < 0) {
(void)close(fd[0]);
(void)close(fd[1]);
logPrint(DIRLOG("fork error"));
}else if(pid == 0) {//child
dup2(fd[1], STDOUT_FILENO); //fd[1]作为标准输出
close(fd[1]);
close(fd[0]);
if(-1 == setsid()) {
perror("setsid error:");
}
if(-1 == execvp("a.out", NULL)) {//执行程序
printf("execvp == -1\n");
}
exit(0);
}else {//parent
close(fd[1]);
while(1) {
memset(buff, 0, sizeof(buff));
readNum = read(fd[0], buff, 1024);//一直阻塞
if(readNum <= 0) {
break;
}
}
close(fd[0]);
waitpid(pid, NULL, WUNTRACED);
} 展开
3个回答
展开全部
其实是因为子进程一直循环sleep,printf无法缓冲刷新到管道,导致父进程读取不到。
可以把a.out里的printf换成无缓冲的write系统调用,这样就可以了
可以把a.out里的printf换成无缓冲的write系统调用,这样就可以了
追问
a.out不能修改,昨天查了下,如果该a.out,可以用setvbuf函数就可以解决,这个就有点像在处理协同进程的时候缓冲出问题的情况,有资料说可以用伪终端来解决(不修改a.out的情况下),现在在了解伪终端,但还是希望能有更好的别的办法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序结构我没怎么懂,重发一下我看看
追问
我把格式规范了一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询