gpt4 book ai didi

c - 如何对管道中的数据调用 UNIX 排序命令

转载 作者:行者123 更新时间:2023-11-30 17:22:58 25 4
gpt4 key购买 nike

我正在创建一个 C 程序,并用它在单独 fork 的进程之间设置一个管道以进行进程间通信。

第一个进程已将我需要的数据写入管道中。但是,随着第二个进程从管道中读取数据,我尝试执行该进程以使其成为 UNIX 排序命令。我想以某种方式对管道中的数据进行排序。

如何在管道上调用排序?在命令行上,我可以通过提供文件名作为命令行参数进行排序,例如“排序-r MyFileToSort”。我知道管道本质上被视为文件,但它们仅由文件描述符描述,并且据我所知,sort 不知道如何处理 fd。

感谢您的帮助/反馈

最佳答案

int p[2];
if (pipe(p) != 0) ...report error and do not continue...
pid_t pid = fork();
if (pid < 0) ...report error, close pipe descriptors, and do not continue...
if (pid == 0)
{
/* Child - becomes sort */
dup2(p[0], 0);
close(p[0]);
close(p[1]);
int fd = open("output-file", O_CREAT | O_EXCL | O_WRONLY, 0644);
if (fd < 0) ...report error and exit...
dup2(fd, 1);
close(fd);
execlp("sort", "sort", (char *)0);
...report error and exit...
}
else
{
/* Parent - writes data to sort */
close(fd[0]);
...write data to fd[1]...
close(fd[1]);
int status;
int corpse;
while ((corpse = wait(&status)) > 0 && corpse != pid)
...consider reporting which child died...
...consider reporting sort status...
...continue with the rest of the program...
}

您可以决定是否报告与 dup2() 失败或 close() 失败相关的错误。在这两种情况下,除了报告问题并退出之外,您无能为力。除非有人通过不向你的程序提供标准输入、标准输出和标准错误(或者程序中其他地方关闭了任何标准 channel )来让你的程序遭受残酷和不寻常的惩罚,否则管道和文件描述符就不能被使用。标准 I/O 描述符,因此关闭是安全的。如果您不确定用户的病情有多严重,您可以保护关闭:

if (p[0] > FILENO_STDERR)
close(p[0]);

这通常是不必要的偏执(但尝试缺少标准 I/O 的程序可能很有趣)。

关于c - 如何对管道中的数据调用 UNIX 排序命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27809692/

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