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);
}

我放了一些语句,但只要命令成功执行printf,程序就不会打印“我是孩子,我的 PID 是”这一行。但是,如果输入命令不正确并且失败,它会打印上面的行。

我希望在这两种情况下都会打印该行,因为 print 语句是之前的execlp

4

1 回答 1

0

这应该在执行之前刷新标准输出。

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