dup2 : write() 重定向,但不是 fprintf() 或 puts()
dup2 : write() redirected but not fprintf() or puts()
我正在尝试读取子进程的 STDOUT。
这是fork函数(是的,c ++)。
bool ForkAvecBus::start() {
child_pid = fork();
if(child_pid == -1)
return true;
if(child_pid == 0) {
/* Child process closes up input side of pipe */
close(child_stdin[WRITE]);
dup2 (child_stdin[READ], STDIN_FILENO);
close(child_stdout[READ]);
dup2 (child_stdout[WRITE], STDOUT_FILENO);
close(child_stdout[WRITE]);
execl("/bin/sh", "/bin/sh", "-c", ExecName.c_str(), NULL);
exit(0);
} else {
/* Parent process closes up output side of pipe */
close(child_stdin[READ]);
close(child_stdout[WRITE]);
signal(SIGTERM,exit_on_parent_quit);
}
}
这是子进程中的(简单)测试:
int main() {
fprintf(stdout, "fromFprintfn", 12);
puts("auieauie");
write(STDOUT_FILENO, "fromWrite", 9);
}
这是阅读方法:
void ForkAvecBus::readFromChild() {
FILE* fp = fdopen(child_stdout[READ], "r");
// Tests
int bytes_read = -1;
char readbuffer[1000];
while (1) {
//char c=getc(fp);
//std::cout << "From child: <<" << c << ">>" << std::endl;
bytes_read = read(child_stdout[READ], readbuffer, 999);
if (bytes_read <= 0)
break;
readbuffer[bytes_read] = ' ';
std::cout << "From child: <<" << readbuffer << ">>" << std::endl;
}
}
如您所见,我也尝试了 getc()。我得到的只是:
From child: <<fromWrite>>
为什么 fprintf(和 printf)和 put 没有重定向?
您在此处观察到的行为可能是由于缓冲区造成的。由于write(STDOUT_FILENO,...)
绕过运行时缓冲区,因此它直接到达管道。另外两个在运行时内缓冲。
puts
、fprintf(stdout,...)
和write(STDOUT_FILENO,...)
之间的区别在这篇文章中解释:linux C 中标准输出和STDOUT_FILENO的区别
只需在您的孩子计划结束时致电fflush
即可。
要检验理论:
#include<cstdio>
#include<unistd.h>
int main() {
fprintf(stdout, "fromFprintfn", 12);
puts("auieauie");
write(STDOUT_FILENO, "fromWrite", 9);
return 0;
}
程序打印:
fromWritefromFprintf
auieauie
看到顺序不是你所期望的。我的建议是不要错过程序中的STDOUT_FILENO
和stdout
。坚持其中之一,并记得打电话给fflush
。
相关文章:
- 如何使用 fprintf 将连续的 512 字节保存到文件中
- 哪个更适合从C++写入敏感的日志文件,在文件描述符上写()或文件上的fprintf()?
- fprintf 不打印到文件,当文件指针在其他地方声明时
- 为什么 ofstream 比 fprintf 慢?
- fprintf stdout 没有 100% 准确转储数据
- 使用 fprintf 连续写入字符串
- 我如何自定义fprintf以启用禁用
- 如何使用std :: fprintf()打印一个长字符串
- fprintf:打印文字十六进制字符串
- 为什么 puts() 不适用于声明的字符串
- C4477: 'fprintf' :格式字符串 '%s' 需要类型为"char *"的参数,但可变参数 1 的类型为"int *"
- 编写自定义 FPrintF
- 要在不使用cout的情况下打印某些内容,请使用printf或puts()
- 打印带有 fprintf 的字符串
- C++ fprintf 只打印第一个字符串
- 如何解释 c++ 中 "puts" 的奇怪输出?
- fprintf、字符串和矢量
- 用"fprintf"打印错误后调用"getchar()"有什么意义?
- dup2 : write() 重定向,但不是 fprintf() 或 puts()
- 从动态库(c++)调用fprintf