[解決済み] C: `write error: フォーク、dup2、execvの後に`Bad file descriptor`が発生しました。
2022-02-04 17:55:29
質問
続きはこちら この問題 , でも、もう一度言います。
宿題で、リダイレクトを含む基本的なシェルを書かなければなりません。プログラムは readline を使って入力を促し、入力文字列を解析し、実行ファイル名、引数、および該当する場合は入出力ファイル (複数可) に分解します。文字列を解析した後、子プロセスのexecv()をフォークし、渡された実行ファイルを実行します。私は dup2() を使って、フォーク後、execv の前にファイル記述子を変更していますが、プログラムが新しい実行ファイルにexecvすると、問題が発生します。私のシェルで以下を実行すると
ls > foo.out
と表示されます。
ls: write error: Bad file descriptor
以下は、私の子プロセスのコードです (これは fork() の後です)。
int _child(struct command *c){
int ret;
/* When given `ls > foo.out`, these next two lines output:
** c->infile is (null)
** c->outfile is foo.out
*/
printf("c->infile is %s\n",c->infile);
printf("c->outfile is %s\n",c->outfile);
if(c->infile){
int fd = open( c->infile, O_RDONLY);
int _fd_dup = dup2(fd,0);
close(0);
if(_fd_dup != 0){
fprintf(stderr, "Failed to redirect command input.\n");
return 0;
}
}
if(c->outfile){
int fd = open( c->outfile, O_WRONLY | O_CREAT | O_TRUNC, 0600);
int _fd_dup = dup2(fd,1);
close(1);
if(_fd_dup != 1){
fprintf(stderr, "Failed to redirect command output.\n");
return 0;
}
}
Failed to redirect command output."というエラーは出ません。これは宿題なので、誰かに直してもらうのではなく、正しい方向性を示してほしいのです。
解決方法は?
問題はこのコードのビットにあります。
int _fd_dup = dup2(fd,1);
close(1);
を閉じる必要があります。
fd
ではなく
1
. fd 0 の場合も同じ問題がありますね。
関連
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。