关于在《LINUX C编程实战》这本书上的一个关于管道的程序问题
在书上有一个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,也就是错误 。
这是什么?
谁能给个详细点的解释?
**/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,也就是错误 。
这是什么?
谁能给个详细点的解释?
...全文
相关推荐
Linux系统编程精髓解析
文件I/O是Linux系统编程的另一个重要内容。洛夫详细讲解了如何通过标准的C库函数和Linux特有的系统调用来操作文件,包括打开、关闭、读取、写入和定位文件指针等操作。
C 语言编程 — 管道操作
目录 文章目录目录Linux 的管道指令C 语言的匿名管道命名管道匿名管道和命名管道的区别参考文档 Linux 的管道指令 如果你熟悉 Linux,那么你对管道应该不会感到陌生,我们经常会使用 “|” 来使用管道。但是管道的真正定义是什么呢? 管道是一个进程连接数据流到另一个进程的通道,它通常用作把一个进程的输出通过管道连接到另一个进程的输入。 例如:ls -l | grep string。 C 语言的匿名管道 C 语言的匿名管道 pipe() 定义在头文件 unistd.h 中。 int pipe(f
Linux编程白皮书
通过学习,读者可以更有效地找出并修复程序中的错误,同时也能更好地管理代码版本和协同开发。最后,书中可能会提供一些实战项目或案例分析,让读者将所学知识应用到实际问题中,提升解决实际问题的能力。
LINUX与UNIX SHELL编程指南.rar
**案例研究和实战应用**:提供实际问题的解决方案,展示如何利用Shell编程解决系统管理中的常见问题。
Linux软件工程师(C语言)实用教程_实例源码
Linux软件工程师(C语言)实用教程是一本专为学习Linux环境下C语言编程的读者准备的指导书籍。本书的核心特点是通过大量的实例来教授C语言在Linux系统中的应用,旨在提升读者的实战技能。


