1

Linux アプリケーションを作成しています。fork()コンソール入力を受け取るアプリケーションを呼び出して実行するとどうなりますか? 以下のコードを検討してください。

int process_id = fork();

if (process_id != 0) {
    /* this is the parent process */
    error = execv("../my_other_app", "parameter1", NULL);
    if (error < 0) {
        printf("error!");
    }
} else {
    /* this is the child process. Wait for my_other_app to set up */
    sleep(3);
    /* now continue */
}

printf("########## press ENTER to stop ##########\n");
getchar();

exit(0);

問題は、Enter キーを押して停止するmy_other_appというメッセージもあります。では、呼び出しを行うとき、どのアプリケーションがそれを読んでいるのでしょうか? メインアプリケーションまたは起動した?getchar()my_other_appexecv

編集:my_other_appコンソールよりも優先されるテストを通じて表示されます。これは毎回起こりますか?コンソールが代わりにメイン プロセスによって所有されていることを確認する方法はありますか?

4

3 に答える 3

2

fork()dup()単一のファイル記述子ごとに呼び出します。実際には、子のすべてのファイルのコピーを取得します。一部の「プロセス」(フック経由) がfork()ファイル記述子を検出して閉じる場合がありますが、それはほとんどありません。一部のファイルは、 で閉じる必要があるという特定のフラグで開かれる場合がありますexecv()stdinはそれらの 1 つではありません。

子プロセスでstdinを閉じるだけですが、問題が発生するか、 /dev/null.

freopen("/dev/null", "r", stdin);

stdoutstderrについても同じことができます。


プログラムの最後に「永久に待機」を追加します (もう getchar() を実行できないため):

for(;;) sleep(0x7FFFFFFF); // for(;;) is probably superfluous

それはおそらく最も簡単な方法です。決して変更されないことがわかっているファイルで select() を使用するなど、他にも多くの方法があります...

于 2014-02-01T03:57:16.507 に答える
1

my_other_app他の子プロセスが優先されているため、優先されているように見えると思いますsleep(3)

于 2014-02-01T03:16:17.540 に答える