出力をファイルにリダイレクトする必要のあるシェルに関数を書きます。たとえば、ユーザー書き込み:ls -l >> file
とls -l
をファイルに書き込む必要があります。ほとんどすべてのことが正しいですが、最初に私の関数プログラムを停止した後、私は何も書き込めません。私は私の機能を提示し、私は問題を解決するために、任意の手掛かりをいただければ幸いです下:dup2の後にカスタムシェルが動作しなくなる
void execute2(char *command, char **argv, char **argv2)
{
pid_t pid;
int status;
if ((pid = fork()) < 0)
{
printf("*** ERROR ***\n");
exit(1);
}
else if (pid == 0)
{
close(1);
parse(command, argv, argv2);
int output = open(*argv2, O_APPEND | O_WRONLY);
dup2(output,1);
if (strcmp(argv[0], "exit") == 0)
exit(0);
if (execvp(*argv, argv) < 0)
{
printf("*** ERROR ***\n");
exit(1);
}
close(output);
}
else
{
while (wait(&status) != pid);
}
}
command
は、ユーザから取得コマンドがargv
は、命令とパラメータとargv2
出力ファイルがあるの一部である、です。
'dup2(出力、1)の後と' execvp() 'の前、' strcmp() 'の前に' close(出力) 'してください。 'execvp()'からの戻り値をテストする必要はありません。それが失敗した場合にだけ返します。 –
何とか子供が死ぬことを忘れてしまったら、あなたの待機ループは永遠に回転します。デバッグの場合は、プロセスIDとステータスをキャプチャして出力します。堅牢性のために。 'int corpse;を使う。 intステータス。 ( "状態(%)"は状態0x.4Xで終了しました\ n "、死体、状態);これは完璧ではありません。 'errno == EINTR'でシグナルが処理され、' wait() 'が' -1'を返す可能性は無視されます。少なくともこのように、あなたは何が起こっているのか知っているでしょう。 –
あなたはどのようなコマンドをしていますか? 'ls'を起動している場合は、これが返されなければなりません。 stdinからの読み込みを阻止しようとしている 'cat'やその他のものを呼び出すのであれば、シグナルを送信するまで実行すると思います。 –