繁体   English   中英

如何在管道中的数据上调用UNIX sort命令

[英]How to call UNIX sort command on data in pipe

我正在创建一个C程序,并使用它在单独的分叉进程之间建立管道,以进行进程间通信。

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

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

感谢您的帮助/反馈

你并不需要通过sort任何参数在这种情况下,在所有指定的输入源或输出汇。 相反,在exec它之前,您应该视情况将管道的文件描述符附加到其stdin(如果从管道接收数据,则为FD 0)或stdout(如果将数据写入管道,则为FD 1)。

请参见dup2()调用,该调用可让您为此设置FD的复制目标。 正如@JonathanLeffler指出的那样,您将需要确保在执行调用之前关闭原始FD(将它们复制到所需的数字之后)。


既然您已经在注释中阐明了您的目标是写入文件,则可以在调用exec之前将FD 1附加到该目标文件,而将FD 0附加到包含输入的管道的输出端。

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()失败有关的错误。 在这两种情况下,除了报告问题并退出外,您无能为力。 除非有人不向您的程序提供标准输入,标准输出和标准错误(或者程序中其他地方的内容关闭了任何标准通道)使之遭受残酷和异常的惩罚,否则管道和文件描述符就无法标准的I / O描述符,因此关闭是安全的。 如果不确定用户的病情,可以保护关闭:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM