ホーム>source

私のウィズウィズ子プロセスのステートメントは正しく機能しません。

<前>ウィズウィズ

これは出力です: エラー

  • どうすれば修正できますか?
scanf
あなたの答え
  • 解決した方法 # 1

    プログラムで何が起こっているかの説明については、この質問を参照してください:親プロセスの終了後、子プロセスは読み取ることができません。最も重要な部分:

    ウィズウィズ

    プログラムを期待どおりに動作させるには、

    The terminal is controlled by the foreground process group. When the shell invokes the parent, it makes the parent the leader of the foreground process group. The child inherits that group and has access to the terminal.

    However, when the parent exits, the shell takes back control of the terminal and becomes the leader of the foreground process group. The child is no longer in the foreground process group, so it has no access to the terminal.

    を追加します  親プロセスを呼び出して、子プロセスが完了するまで親プロセスが終了しないようにして、子が端末を利用できるようにします。

    例えば:

    <前>ウィズウィズ

    考慮すべきその他の一般的な改善点に注意してください。

    関数呼び出しの戻り値を常に確認してください。ウィズウィズ  特に wait で結果を使用する前に確認する必要があります 。同様に #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(int argc, char **argv) { int operando, operatore; pid_t pid2 = fork(); if (pid2 == 0) { // Figlio 2 printf("Inserisci due numeri: "); scanf("%d%d", &operando, &operatore); //even though I " %d%d"... printf("Operando is %d and operatore is %d\n", operando, operatore); } else if (pid2 > 0) { wait(NULL); } return 0; }  戻り値のエラーをチェックする必要があります。

  • 解決した方法 # 2

    scanf への呼び出し  失敗した。 printf の戻り値をチェックした場合、コードはこれを知っている可能性があります   2以外の戻り値は、エラーが発生したことを示します。

    scan()は最初の「入力フォーマット変換」指定子で失敗したため、2番目の「入力フォーマット変換」指定子を確認しませんでした。

    整数の「入力フォーマット変換」指定子が fork の呼び出しで  失敗すると、ターゲット変数は0に設定されます。2番目の変数は、メモリ上のスタック上の場所にあるゴミ箱を表示します。

    scanf()

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ php - 日付形式をY-m-dからd-m-Yに変換する方法は?