首页 > 解决方案 > exec* POSIX 函数中的管道

问题描述

如何转换:

system("ps -el | grep fork")

函数的参数execlp

我试过了:

execlp("ps", "ps", "-el", "|", "grep", "fork", (char*)0)

和:

execlp("ps", "ps", "-el", "grep", "fork1", (char*)0)

但两者都不起作用。是否可行?

标签: clinuxpipeexecposix

解决方案


管道不是 POSIX 系统上的自动功能,您必须自己实现它。

为此,您有pipefork系统调用。

pipe函数创建一对文件描述符,一个用于写入,一个用于读取。该fork函数“分叉”了一个新进程。

诀窍是使用该pipe函数创建一个管道,并创建一个子进程。然后父进程可以使用管道的写入文件描述符映射到进程的标准输出(通常使用dup2函数完成)。然后父进程处理exec管道的第一个(左侧)命令。

子进程获取管道的读取描述符,并将其映射到标准输入,类似地exec,管道的另一端(右侧)的命令。

这将导致从第一个命令到标准输出的所有输出都通过管道传输到第二个命令的标准输入。

互联网上有许多关于如何实际执行此操作的教程和示例。


推荐阅读