当前位置: 技术问答>linux和unix
菜鸟提问,关于管道
来源: 互联网 发布时间:2016-08-24
本文导语: int fd[2]; pid_t pid; socketpair(AF_UNIX, SOCKET_STREAM, 0, fd);// 创建管道 if ( (pid = fork()) == 0) {// 子进程 close(fd[0]);// 关闭管道的父进程端 dup2(fd[1], STDOUT_FILENO);// 复制管道的子进程...
int fd[2];
pid_t pid;
socketpair(AF_UNIX, SOCKET_STREAM, 0, fd);// 创建管道
if ( (pid = fork()) == 0) {// 子进程
close(fd[0]);// 关闭管道的父进程端
dup2(fd[1], STDOUT_FILENO);// 复制管道的子进程端到标准输出
dup2(fd[1], STDIN_FILENO);// 复制管道的子进程端到标准输入
close(fd[1]);// 关闭已复制的读管道
/* 使用exec执行命令 */
} else {// 父进程
close(fd[1]);// 关闭管道的子进程端
/* 现在可在fd[0]中读写数据 */
shutdown(fd[0], SHUT_WR);// 通知对端数据发送完毕
/* 读取剩余数据 */
close(fd[0]);// 关闭管道
/* 使用wait系列函数等待子进程退出并取得退出代码 */
}
我知道管道应该在一个进程关闭读端只写数据,另一个进程关闭写端只读数据。
有2个疑问:
1,在执行exec后,子进程怎么取得管道句柄?(通过参数传递?还是在没有execclose后,怎么获得?)
2,上面的代码为什么要把标准的输入输出复制到管道句柄,和问题1有关吗?
谢谢!!
pid_t pid;
socketpair(AF_UNIX, SOCKET_STREAM, 0, fd);// 创建管道
if ( (pid = fork()) == 0) {// 子进程
close(fd[0]);// 关闭管道的父进程端
dup2(fd[1], STDOUT_FILENO);// 复制管道的子进程端到标准输出
dup2(fd[1], STDIN_FILENO);// 复制管道的子进程端到标准输入
close(fd[1]);// 关闭已复制的读管道
/* 使用exec执行命令 */
} else {// 父进程
close(fd[1]);// 关闭管道的子进程端
/* 现在可在fd[0]中读写数据 */
shutdown(fd[0], SHUT_WR);// 通知对端数据发送完毕
/* 读取剩余数据 */
close(fd[0]);// 关闭管道
/* 使用wait系列函数等待子进程退出并取得退出代码 */
}
我知道管道应该在一个进程关闭读端只写数据,另一个进程关闭写端只读数据。
有2个疑问:
1,在执行exec后,子进程怎么取得管道句柄?(通过参数传递?还是在没有execclose后,怎么获得?)
2,上面的代码为什么要把标准的输入输出复制到管道句柄,和问题1有关吗?
谢谢!!
|
dup2(fd[1], STDOUT_FILENO);
dup2(fd[1], STDIN_FILENO);
由于有了上面两句。
exec后的进程的标准输入和标准输出都是fd[1]了,只需要 read(0, ...), write(1, ...),
或者干脆fgets()/printf(),就是从fd[1]读/想fd[1]写
dup2(fd[1], STDIN_FILENO);
由于有了上面两句。
exec后的进程的标准输入和标准输出都是fd[1]了,只需要 read(0, ...), write(1, ...),
或者干脆fgets()/printf(),就是从fd[1]读/想fd[1]写
|
子进程会复制父进程的存储空间
也就是说你fork一个进程后,子进程有一个和父进程一样的变量的副本
它们值都和父进程的一样,直到你更改它
也就是说你fork一个进程后,子进程有一个和父进程一样的变量的副本
它们值都和父进程的一样,直到你更改它