您的位置:首页 > 其它

管道pipe与dup结合使用,应用实例

2017-04-14 15:53 429 查看
管道的一种常见用法:在父进程创建子进程后向子进程传递参数。例如,一个应用软件有一个主进程和很多个不同子进程。

主进程创建子进程后,在子进程调用exec函数执行一个新程序前,通过管道给即将执行的程序传递命令行参数,子进程根据传来

的参数进行初始化或其他操作。

大致思路:

The child can then exec() another program, which inherits the standard streams.

父进程关闭 管道读端 close( fd[0] ); 调用 dup2(fd[1], STDOUT_FILENO); 将管道的写端重定向到标准输出

子进程关闭 管道写端 close( fd[1] ); 调用 dup2(fd[0], STDIN_FILENO); exec调用的进程中读取标准输入

main程序:

#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[], char** environ)
{
char* str = "from parent's message";
int stat;
pid_t pid;
int fd[2];

pipe(fd);

pid = fork();
if(0 == pid)//child read
{
close(fd[1]);
dup2(fd[0], STDIN_FILENO);

execve("myprocess", argv, environ);

}
else//parent write
{

close(fd[0]);
int old = dup(STDOUT_FILENO);
int new = dup2(fd[1], STDOUT_FILENO);

write(fd[1], str, strlen(str)+1);

dup2(old, new);//恢复重定向

wait(&stat);//
if ( WIFEXITED(stat) )
{
printf("child exited with code:%d\n", WEXITSTATUS(stat));
}

close(fd[1]);

exit(0);

}

}


myprocess程序:

#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
printf("myprocess begin\n");
char buf[30];
bzero(buf, sizeof(buf));

read(STDIN_FILENO, buf, sizeof(buf));

printf("recv message:%s\n", buf);

exit(33);

}


main程序的执行结果:

myprocess begin
recv message:from parent's message
child exited with code:33

------------------------------------------------------------------------

可见,exec调用的程序获取到了主进程写入管道的数据。

这在实际项目中是经常用到的,主进程启动多个不同功能的exec调用,并通过管道的方式传递数据给启动的程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: