我正在尝试在C中实现多个管道,如
ls - al | less | wc
我在创建管道时遇到了麻烦。我有一个循环,它应该创建进程并用管道连接它们:
for(i=0;i<num_cmds;i++){
create_commands(cmds[i]);
}
我的create_commands()
功能看起来像这样
void create_commands (char cmd[MAX_CMD_LENGTH]) // Command be processed
{
int pipeid[2];
pipe(pipeid);
if (childpid = fork())
{
/* this is the parent process */
dup2(pipeid[1], 1); // dup2() the write end of the pipe to standard output.
close(pipeid[1]); // close() the write end of the pipe
//parse the command
parse_command(cmd, argvector);
// execute the command
execvp(argvector[0], argvector);
close(1); // close standard output
}
else
{
/* child process */
dup2( pipeid[0], 0); // the read end of the pipe to standard input
close( pipeid[0] ); // close() the read end of the pipe
}
}
但这不起作用,我得到了我的stdin和stdout搞砸了。 谁能指点我做错了什么?
提前谢谢!
答案 0 :(得分:1)
popen()函数执行string命令指定的命令。它在调用程序和执行的命令之间创建一个管道,并返回一个指向流的指针,该流可用于读取或写入管道。
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
int status;
int PATH_MAX = 1024;
char path[PATH_MAX];
fp = popen("ls -al | less | wc", "r");
if (fp == NULL)
/* Handle error */;
while (fgets(path, PATH_MAX, fp) != NULL)
printf("%s", path);
status = pclose(fp);
if (status == -1) {
/* Error reported by pclose() */
} else {
/* Use macros described under wait() to inspect `status' in order
to determine success/failure of command executed by popen() */
}
}
你可以使用在popen()中调用的预设字符串,你也可以使用你的argv []参数来管理它。
popen()为您提供管道,FIFO先进先出流,并且popen还将STDOUT反馈给您的程序。
这是popen()的手册页: http://linux.die.net/man/3/popen