关于在《LINUX C编程实战》这本书上的一个关于管道的程序问题

Artist_jim 2011-11-21 05:17:45
在书上有一个2段程序 是用管道实现父子进程的通信,以下是代码:
**/monitor.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int arg,char *argv[],char ** environ)
{
int fd[2];
pid_t pid;
int stat_val;
if(pipe(fd)){
perror("pipe failed\n");
exit(1);
}
pid=fork();
switch(pid){
case -1:
perror("fork failed\n");
exit(1);
case 0:
close(fd[1]);
dup2(fd[0],0);
execve("ctrlprocess",(void *)argv,environ);
exit(0);
default:
close(fd[0]);
write(fd[1],"test",4);
break;
}
wait(&stat_val);
exit(0);
}



***/ctrlprocess.c
#include <stdio.h>
#include <unistd.h>
int main(int arg,char *argv[])
{
int n;
char buf[1024];
n=read(stdin,buf,1024);
if(n>0){
buf[n]='\0';
printf("%s%d\n",buf,n);
sleep(1);
exit(0);
}
printf("failed\n");
sleep(1);
exit(1);
}
这是自己简化后的程序 ,基本没改变什么
编译通过,但运行的时候ctrlprocess里面的read返回的都是1677725,貌似是-1,也就是错误 。
这是什么?
谁能给个详细点的解释?
...全文
51 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cpp618 2013-04-19
  • 打赏
  • 举报
回复
奇怪,0不就是stdin吗?求解
Artist_jim 2011-11-21
  • 打赏
  • 举报
回复
太感谢了,原来是这里出问题了,虽然搞了1天了,但是其他的收获还是挺多了
zzbinfo 2011-11-21
  • 打赏
  • 举报
回复
 n=read(stdin,buf,1024);
改成
 n=read(0,buf,1024);
就ok了
Artist_jim 2011-11-21
  • 打赏
  • 举报
回复
没人? 这个程序研究了1天了都没结果,试着改了一些可能有问题的地方,但之后发现那个read都返回1677725
难道是关闭管道端口出错,还是把管道的读端复制到fd=0 的端口(也就是标准输入端口)那里错误 啊,
已经使用了各种办法,但都不知道原因,真心求高手指点下啊

23,115

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧