我必须捕获程序中的stdout并将其写入文件中...所以我创建了一个管道。在父进程中,我使用dup()捕获了管道中的stdout,并且我需要将它存入一个文件中...所以我在子进程中做了一个dup()以获取捕获的文件描述符到stdin中。现在,我如何使用fwrite()将此stdin写入文件?使用fwrite将stdin写入文件()
0
A
回答
0
你应该捕获到一个字节或字符缓冲区和fwrite的发送。 当我说一个缓冲区时,我的意思是一个数组或动态分配的字节/字符块。
2
难道不是这样做吗?您需要在父项中执行的操作是使用freopen()
将stdout连接到您选择的文件。
FILE *fp = freopen("/tmp/mylogfile", "w", stdout);
if (fp == 0)
error("...something went wrong opening the log file...\n");
直接回答你的问题是:
char buffer[32768];
ssize_t nbytes;
FILE *fp = fopen("/tmp/mylogfile", "w");
if (fp == 0)
error("....something went wrong opening my log file...\n");
while ((nbytes = fread(buffer, sizeof(char), sizeof(buffer), stdin)) > 0)
if (fwrite(buffer, sizeof(char), nbytes, fp) != nbytes)
error("...something went wrong writing to standard output...\n");
然而,这是没有什么必要。您可以通过各种方式改进错误处理;我简单地假设'error()'报告消息,并且不返回。
1
最简单的方法就是打开文件和规定,在有孩子的stdout:
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t pid = fork();
switch (pid) {
case -1:
perror("fork");
return 1;
case 0:;
int new_out = open("output.txt", O_WRONLY | O_CREAT, 0666);
if (new_out == -1) {
perror("open");
return 1;
}
if (dup2(new_out, 1) == -1) {
perror("dup2");
return 1;
}
char* args[] = {"/bin/echo", "test output", 0};
execv(args[0], args);
perror("exec");
return 1;
default:;
int s;
if (waitpid(pid, &s, 0) == -1) {
perror("waitpid");
return 1;
}
if (WIFEXITED(s)) {
return WEXITSTATUS(s);
}
return 1;
}
}
相关问题
- 1. Wordpress不使用fwrite()写入文件夹;
- 2. 如何使用fwrite将引号写入.txt文件
- 3. 使用fwrite将结构指针写入文件
- 4. 如何使用fwrite将结构写入文件?
- 5. 如何在PHP中使用fwrite命令将$ symbol写入文件
- 6. fwrite不写入
- 7. Bash:从文件读取stdin并将stdout写入文件
- 8. PHP fwrite写空文件
- 9. 如何使用fwrite写入数据0xf0f0f0f0
- 10. fwrite,使用“a”多次写入
- 11. 从PHP写入stdin?
- 12. 将函数结果写入stdin
- 13. 将文本区域的内容保存到文件时,fwrite不会写入
- 14. 如何使用fread和fwrite函数读取和写入二进制文件?
- 15. 使用QuaZip将QStream写入zip文件
- 16. 使用DataOutputStream将int写入文件
- 17. 使用Python将SQLite写入文件
- 18. PHP的fwrite的停止写入套接字文件指针
- 19. 通过PHP的fwrite写入UTF-8文件
- 20. 写入映像文件时发生C++ fwrite访问冲突
- 21. 写入子进程的stdin
- 22. 将文件写入
- 23. 使用写入将整数写入文件描述符?
- 24. 使用fwrite制作文件环绕
- 25. 使用fwrite保存.xls文件
- 26. 使用fwrite替换文件内容
- 27. 使用文件写入操作将5M数据写入csv文件
- 28. 将文字写入文件?
- 29. 使用fwrite,要在每次写入之间跳过写入三个项目
- 30. MATLAB尝试使用fwrite写入现有的空文本文件时无效的文件标识符
是的,可是这只是一个学习C方式...我努力去学习使用管道。 – sfactor 2009-12-31 05:38:45
好的 - 这样做不会有什么坏处;它为做事情找借口不合适的技巧。我已经给出了直接的答案。但是,如果我使用管道作为管道,而不是巧合地使用碰巧连接到管道的文件流,我会使用文件描述符I/O调用(例如read()和write()),而不是文件流I/O调用如fread()和fwrite()。 – 2009-12-31 05:42:52
使用管道(尤其是使用dup()时要记住的主要问题是关闭管道未使用的端点。如果你不这样做,事情不会正确终止。 – 2009-12-31 06:49:53