-1
case 1:
    if (fork())
        wait(0);
    else
        execlp("ls", "ls", (char *)NULL);
    break;

以前シェルスクリプトを使って作ったユーザーインターフェースをC言語でTextual表示Menuにするように言われました。私は ncurses ライブラリを調べましたが、Linux の C のメニューに ncurses を使用して以前に実装されたコードを教えてくれる人がいれば、感謝します。

4

3 に答える 3

1

表示しているコードは単なるスニペットであり、「関数」ではありません。switchステートメントの途中からコピーされたようです。

切り替えられた式の値が 1 の場合fork()、新しいプロセスになります。その後、子プロセスがプログラムexeclp()を実行しlsます。親は子が完了するのを待ちます。

于 2012-11-02T09:56:04.740 に答える
0

その秘密はフォークにあります。

成功すると、子プロセスの PID が親に返され、0 が子に返されます。失敗すると、-1 が親プロセスに返され、子プロセスは作成されず、errno が適切に設定されます。

フォークすると、別のプロセスが取得され、最初のプロセスとまったく同じように実行されます。唯一の違いは、子プロセスで fork が異なる値を返したことです。

あなたのコードは基本的に言っています:

私が親なら待っててね。

私が子供の場合は、仕事をしてください。あなたの場合は、ディレクトリのリストを取得してください。

ディレクトリの一覧表示が完了したら、子が死亡し、親が元の生活に戻ると想定しています。

これは、あなたがしていることを行うためのかなり典型的なコードです。「メニュー」であるメインアプリケーションがあり、通常どおりの生活に戻る前に、メニューに必要なシェルコマンドを実行するだけで、自分の一時的なコピーを生成しています。

チェックアウトman fork...フォーク

于 2012-11-02T10:00:44.723 に答える
0

コードについて:

case 1:
    if (fork())
        wait(0);
    else
        execlp("ls", "ls", (char *)NULL);
    break;

fork()新しいプロセス、正確なコピーを作成します。Fork は、子プロセスの PID を親 ( を実行するためwait(0)) と0子プロセス ( を実行するため) に返しexeclp()ます。

execlp()プロセスを変更しています(実行可能ファイルと引数を示しています)。対応する以下を参照してくださいman pages

于 2012-11-02T10:01:08.053 に答える