【发布时间】:2014-01-01 12:33:59
【问题描述】:
我正在尝试使用 pipe、fork 和 exec 与 C 中的外部程序进行交互。我想强制外部程序执行无缓冲 I/O。到目前为止,这是我的代码中的一个相关 sn-p:
...
pid = fork();
if (pid == (pid_t) 0)
{
/* child process */
/* make pipe connections to standard streams */
dup2(wpipe[0], STDIN_FILENO);
dup2(rpipe[1], STDOUT_FILENO);
/* close pipe endings */
close(wpipe[0]); close(rpipe[0]);
close(wpipe[1]); close(rpipe[1]);
/* unbuffered I/O */
setvbuf(stdin, NULL, _IONBF, BUFSIZ);
setvbuf(stdout, NULL, _IONBF, BUFSIZ);
if (execl("path/to/some_binary", "path/to/some_binary", (char *) NULL) == -1)
{
fprintf(stderr, "exec failed\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
...
这不起作用,因为流在exec 调用中无法生存。所以使用setvbuf 强制无缓冲I/O 不起作用,因为程序映像(some_binary)创建了它自己的标准输入和标准输出流,并且不使用我称为setvbuf 的流。
当我在其代码中添加setvbuf 调用后重新构建some_binary 时,该程序确实可以工作。但是,如果您对传递给exec 的二进制文件没有任何控制权,怎么办?如何使它适用于像 cat 或 ls 这样的 unix 命令?
【问题讨论】:
-
查看
unbuffer自带的expect命令。 -
你为什么这么问??用例是什么????
-
当使用两个管道与子进程进行双向通信时。使用 I/O 缓冲,父进程中的读取操作会因为输出已被子子进程缓冲而被阻塞。
-
究竟在child进程中运行的程序(
execve之后)是什么? -
相关:There are existing utilities that can do it for you。忽略 Python 特定的代码或在 C 中重新实现它,例如,在伪 tty 上有一个选择循环。