gpt4 book ai didi

c - 如何在 C 中创建 Linux 管道示例

转载 作者:IT王子 更新时间:2023-10-29 00:51:25 27 4
gpt4 key购买 nike

我正在尝试学习如何在 C 中使用 pipe() 命令,并尝试创建一个测试程序来复制 ls | 的功能。 grep ".c",如果我要将其输入 linux 终端。如果我将其输入终端,结果只会得到 test.c

我的代码如下:

#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "fcntl.h"

int main(int argc, char** argv)
{
int pipefd[2];
int childpid,childpid2;
char* cmd[3]={"ls",NULL,NULL};
char* cmd2[3]={"grep",".c",NULL};
pipe(pipefd);
if(childpid=fork()){
//parent
}else{
//child
//write
close(pipefd[0]);
dup2(pipefd[1],STDOUT_FILENO);
execvp("ls", cmd);
}
if(childpid2=fork()){
}
else{
close(pipefd[1]);
dup2(pipefd[0],STDIN_FILENO);
execvp("grep",cmd2);
}
close(pipefd[0]);
close(pipefd[1]);
return 0;
}

此代码返回以下结果($ 是终端提示符):

$a.out
$test.c
(blank line)

程序没有完成,而是挂起直到我退出它。我有什么问题?我怎样才能模仿终端?我是 C 的新手,使用的是预制的程序模板,如果有明显的错误,请原谅我。

最佳答案

试试这个:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char** argv)
{
int pipefd[2];
int childpid,childpid2;
char* cmd[3]={"ls",NULL,NULL};
char* cmd2[3]={"grep",".c",NULL};
pipe(pipefd);
if(childpid=fork()){
//parent
close(pipefd[1]);
dup2(pipefd[0],STDIN_FILENO);
execvp("grep",cmd2);
}else{
//child
//write
close(pipefd[0]);
dup2(pipefd[1],STDOUT_FILENO);
execvp("ls", cmd);
}
return 0;
}

关于c - 如何在 C 中创建 Linux 管道示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21923982/

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