[解決済み] 標準出力をファイルにリダイレクトする
質問
bashのコマンドと同等のことをしようとしています。
ls>foo.txt
をC言語で作成しました。
下のコードは、出力を変数にリダイレクトします。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
int pfds[2];
char buf[30];
pipe(pfds);
if (!fork()) {
close(pfds[0]);
//close(1);//Close stdout
//dup(pfds[1]);
//execlp("ls", "ls", NULL);
write(pfds[1], "test", 5); //Writing in the pipe
exit(0);
} else {
close(pfds[1]);
read(pfds[0], buf, 5); //Read from pipe
wait(NULL);
}
return 0;
}
コメント行は、リダイレクトに必要だと思われる操作について言及しています。 lsの出力をfoo.txtにリダイレクトするには、何を変更すればよいのでしょうか?
どのように解決するのですか?
あなたのコードが本質的に行っていることは、パイプを開き、プロセスをフォークし、子プロセスで(コメントされたコードで)標準出力を閉じ、パイプを標準出力に複製し、lsコマンドを実行し、(コメントされていないコードで)パイプに4バイトを書き込むということです。親プロセスでは、パイプからデータを読み込んで、子プロセスの完了を待ちます。
今度はstdoutをファイルにリダイレクトしたいと思います。open()システムコールを使ってファイルを開き、そのファイルディスクリプタをstdoutに複製することで実現できます。こんな感じです(テストしていないので、コードのバグに注意してください)。
int filefd = open("foo.txt", O_WRONLY|O_CREAT, 0666);
if (!fork()) {
close(1);//Close stdout
dup(filefd);
execlp("ls", "ls", NULL);
} else {
close(filefd);
wait(NULL);
}
return 0;
しかし、他の回答で提案されているように、freopenを使うこともできます。
しかし、あなたのコードと私の修正したコードには、いくつかの懸念があります。
-
pipe() と open() システムコールは失敗することがあります。システムコールの失敗を常にチェックする必要があります。
-
fork()システムコールは、失敗することがあります。同上。
-
dup() の代わりに dup2() を使用できます。さもないと、stdin が開かれていない場合、最初に利用可能なファイル記述子に複製されるため、このコードは失敗します。
-
execlp()システムコールは失敗することがあります。同上。
-
wait()はシグナル(EINTR)で中断されることがあるようですね。シグナル(errno == EINTR)でシステムコールが中断された場合、再試行するようなラッパーを巻くことが推奨されます。
関連
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み] HTMLページからのリダイレクト
-
[解決済み] jQuery Ajax呼び出し後のリダイレクトリクエストを管理する方法
-
[解決済み] 標準出力ではなく標準エラー出力にパイプを通すにはどうしたらいいですか?
-
[解決済み] Windowsのcmdの標準出力と標準エラー出力を1つのファイルにリダイレクトする
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない