当前位置: 技术问答>linux和unix
关于在《LINUX C编程实战》这本书上的一个关于管道的程序问题
来源: 互联网 发布时间:2017-04-08
本文导语: 在书上有一个2段程序 是用管道实现父子进程的通信,以下是代码: **/monitor.c #include #include #include #include #include int main(int arg,char *argv[],char ** environ) { int fd[2]; pid_t pid; int stat_val; i...
在书上有一个2段程序 是用管道实现父子进程的通信,以下是代码:
**/monitor.c
#include
#include
#include
#include
#include
int main(int arg,char *argv[],char ** environ)
{
int fd[2];
pid_t pid;
int stat_val;
if(pipe(fd)){
perror("pipe failedn");
exit(1);
}
pid=fork();
switch(pid){
case -1:
perror("fork failedn");
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
#include
int main(int arg,char *argv[])
{
int n;
char buf[1024];
n=read(stdin,buf,1024);
if(n>0){
buf[n]='';
printf("%s%dn",buf,n);
sleep(1);
exit(0);
}
printf("failedn");
sleep(1);
exit(1);
}
这是自己简化后的程序 ,基本没改变什么
编译通过,但运行的时候ctrlprocess里面的read返回的都是1677725,貌似是-1,也就是错误 。
这是什么?
谁能给个详细点的解释?
**/monitor.c
#include
#include
#include
#include
#include
int main(int arg,char *argv[],char ** environ)
{
int fd[2];
pid_t pid;
int stat_val;
if(pipe(fd)){
perror("pipe failedn");
exit(1);
}
pid=fork();
switch(pid){
case -1:
perror("fork failedn");
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
#include
int main(int arg,char *argv[])
{
int n;
char buf[1024];
n=read(stdin,buf,1024);
if(n>0){
buf[n]='';
printf("%s%dn",buf,n);
sleep(1);
exit(0);
}
printf("failedn");
sleep(1);
exit(1);
}
这是自己简化后的程序 ,基本没改变什么
编译通过,但运行的时候ctrlprocess里面的read返回的都是1677725,貌似是-1,也就是错误 。
这是什么?
谁能给个详细点的解释?
|
n=read(stdin,buf,1024);改成
n=read(0,buf,1024);就ok了