gpt4 book ai didi

c - 转换 cat file.txt | wc -l 程序代码c

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:43 27 4
gpt4 key购买 nike

我是管道方面的新手,我想开发一个小程序来理解和了解它。我的想法是使用 c 将命令 shell cat 传达给 wc。我正在做一个使用现有文件(例如 test.txt)的非常简单的程序,但目前我只能显示内容。我只想计算 1 个特定文件的行数。

这可以实现吗?或者也许我必须做另一个选择?这是我的基本代码:

int main(int argc, char *argv[]) {
pid_t pid;
int fd[2];

pipe(fd);
pid = fork();

if (pid == -1) {
perror("fork");
exit(1);
}

if (pid == 0) {
/* Child process closes up input side of pipe */
close(fd[0]);
execlp("cat", "cat", "test.txt", NULL);
//I don't know how communicate this process with the other process
} else {
/* Parent process closes up output side of pipe */
close(fd[1]);
execlp("wc", "wc", "-l", NULL);
}
}

最佳答案

在调用 execlp() 之前,您必须将管道的适当末端重定向到标准输入和/或标准输出。如果此调用成功,则当前进程已被新进程替换,不再执行任何代码,但如果失败,则应使用 perror() 进行投诉。

这是代码的更正版本:

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

int main (int argc, char *argv[]) {
pid_t pid;
int fd[2];

if (pipe(fd)) {
perror("pipe");
return 1;
}

pid = fork();
if (pid == -1) {
perror("fork");
return 1;
}

if (pid == 0) {
/* Child process redirects its output to the pipe */
dup2(fd[1], 1);
close(fd[0]);
close(fd[1]);
execlp("cat", "cat", "test.txt", NULL);
perror("exec cat");
return 1;
} else {
/* Parent process redirects its input from the pipe */
dup2(fd[0], 0);
close(fd[0]);
close(fd[1]);
execlp("wc", "wc", "-l", NULL);
perror("exec wc");
return 1;
}
}

关于c - 转换 cat file.txt | wc -l 程序代码c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41347452/

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