プログラムでstdoutをキャプチャしてファイルに書き込む必要があるため、パイプを作成しました。親プロセスでは、dup() を使用してパイプ内の stdout をキャプチャしました。これをファイルに取得する必要があります...そのため、子で dup() を実行して、キャプチャされたファイル記述子を stdin に取得しました。では、fwrite() を使用してこの stdin をファイルに書き込むにはどうすればよいでしょうか?
4474 次
3 に答える
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()」がメッセージを報告し、戻らないと単純に想定しています。
于 2009-12-31T05:33:21.093 に答える
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;
}
}
于 2009-12-31T05:48:03.623 に答える
0
byte または char バッファにキャプチャし、それを fwrite に送信する必要があります。バッファと言うときは、配列または動的に割り当てられたバイト/文字のブロックを意味します。
于 2009-12-31T05:29:49.170 に答える