0

したがって、代入の場合、特に&コマンドライン演算子をエミュレートするシェルを作成する必要があります。

フォーク/実行が停止しました。問題は、WNOHANGでwaitpidを呼び出すと、execvが終了した後にプログラムがハングすることです。Enterキーを押すと、プロンプトが戻り、プログラムは通常どおり動作します。これは、waitpidがブロックされている場合には発生しないことに注意してください。

関連するコードは次のとおりです。

782   pid_t child = fork();  //Create child process
783   
784   char** charArgs = toCharMatrix(*args);
785   
786   //If creation failed, say so
787   if(child == -1) {
788     fprintf(stderr, "Error: Could not create child process.\n");
789     return -1;
790   } 
791   else if(child == 0) {  //else: child process code
792     
793     //If the given command can be executed, attempt to exectue it
794     if(access(charArgs[0], X_OK) == 0) 
795       execv(charArgs[0], charArgs); 
796     else { //Else tell the user that they are an idiot
797       fprintf(stderr, "%s is not a valid path.\n", charArgs[0]);
798       return -1;
799     } 
800     
801     _exit(0);
802   } 
803   else
804     waitpid(-1, NULL, WNOHANG);

最後のelseステートメント(親プロセスコード)で、returnから基本的に何にでも多くのことを試しました。何も役に立たないようです。繰り返しになりますが、WNOHANGオプションを削除するだけで問題は解決しますが、割り当て仕様に準拠していません。

waitpid(-1、NULL、WNOHANG);も呼び出します。ゾンビの子を避けるために、プロンプトが表示される直前のマスターループで。この愚かなキャリッジリターンの問題は、残っている唯一の問題です。前もって感謝します。

4

1 に答える 1

0

実際にwaitpidでハングする可能性はほとんどありません。waitpid呼び出しの戻りコード(およびerrnoまたはstrerror(errno))を出力してみてください。スニペットは、どこにぶら下がっているのかを示していません。プログラムがリターンプレスを必要とする最も可能性の高い理由は、stdinを読み取る関数を呼び出すことです(または親プロセスがブロック待機を行い、子がリターンプレスを待機します)。

于 2012-10-29T07:05:04.350 に答える