0

C プログラミングはよく知っていますが、Unix システム コールの経験はあまりありません。久しぶりに Unix の知識を再確認しています。そこで、fork と execlp のシステム コールから始めました。ubuntu_linux で例を練習しています。

以下は、STD_IN からコマンドを受け取り、それを子プロセスで実行する教科書のサンプル プログラムです。

int main (int argc, char *argv[]) {
   char command[MAX_LINE];
   pid_t pid;
   int   status;

   printf ("%% ");
   while (fgets (command,MAX_LINE,stdin ) != NULL){
        if (command[strlen(command)-1] == '\n')
          command[strlen(command)-1] = '\0';

        if ((pid=fork ()) < 0) {
           perror ("fork failed :  \n");
        }

        if (pid == 0) {
           printf (" I am child and my PID is %d",getpid ());
           execlp (command, command, (char *)0);
           perror ("couldn't execute:"); 
           exit(127);
        }

        printf (" I am parent and my PID is %d\n ",getpid ());
        if ((pid = waitpid (pid, &status, 0)) < 0){
            perror("waitpid error\n");
        }

        printf ("%% ");
    }
    exit (0);
}

いくつかのステートメントを入力しましたが、コマンドが正常に実行されるたびに、プログラムは「I am child and my PID is」printfという行を出力しませんでした。ただし、入力コマンドが間違っていて失敗した場合は、上記の行が出力されます。

print ステートメントが before であるため、両方のシナリオで行が印刷されることを期待していますexeclp

4

1 に答える 1

0

これにより、execの前にstdoutがフラッシュされます。

printf (" I am child and my PID is %d",getpid ());
fflush(stdout);
execlp (command, command, (char *)0);
于 2012-08-31T04:44:57.820 に答える