gpt4 book ai didi

C 多管

转载 作者:行者123 更新时间:2023-11-30 15:50:48 24 4
gpt4 key购买 nike

我正在尝试在 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
}

}

但这不起作用,我的标准输入和标准输出搞乱了。谁能指出我做错了什么?

提前谢谢您!

最佳答案

popen()函数执行字符串命令指定的命令。它在调用程序和执行的命令之间创建一个管道,并返回一个指向流的指针,该流可用于从管道中读取或写入。

#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

关于C 多管,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15580153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com