在execlp调用期间休眠以避免输出';滞后';?可能吗?

在execlp调用期间休眠以避免输出';滞后';?可能吗?,c,linux,shell,process,C,Linux,Shell,Process,目前我正在用C语言为Linux开发一个shell,最近有人向我推荐execlp,让我在shell中执行不同的程序。我目前在shell中实现的示例非常简单,执行shell,运行'date'命令,然后execlp启动'date',很简单,它将日期打印到终端。本例中的问题是,尽管date程序成功执行并打印到终端,但它会在shell提示后立即打印。我猜execlp返回日期太晚了,导致它在提示打印后显示。有没有办法避免“滞后”?一个sleep函数似乎适合这里,但我不知道如何在execlp周围实现它。。有什

目前我正在用C语言为Linux开发一个shell,最近有人向我推荐execlp,让我在shell中执行不同的程序。我目前在shell中实现的示例非常简单,执行shell,运行'date'命令,然后execlp启动'date',很简单,它将日期打印到终端。本例中的问题是,尽管date程序成功执行并打印到终端,但它会在shell提示后立即打印。我猜execlp返回日期太晚了,导致它在提示打印后显示。有没有办法避免“滞后”?一个sleep函数似乎适合这里,但我不知道如何在execlp周围实现它。。有什么想法吗

谢谢

您可以在发出提示之前等待子进程返回。下面的代码过于简化了需要做的事情,但给出了一般要点:

   switch (pid = fork()) {
   case 0:   execlp("date", "date", (char *)NULL);
             exit(EXIT_FAILURE);
   case -1:  perror("fork");
             break;
   default:  while ((r = waitpid(pid, &status, 0)) == (pid_t)-1) {
                if (errno != EINTR) {
                    perror("wait");
                    break;
                }
             }
   }

如果您的“shell”正在“前台”上运行命令,它应该等待进程完成,然后再执行其他操作,包括提示打印。我目前使用的方法利用了fork和execlp。当用户发送命令时,如果该命令与现有命令匹配,将调用命令执行器,该执行器首先进行自身分叉,检查和/或等待PID为0,然后调用execlp(“日期”、“日期”,NULL)。我希望它执行date,打印到stdout,然后从executor函数返回main,然后重新进入shell输入循环。。因此,从技术上讲,它是在前台运行的,我只是不知道如何实现一个sleep()函数,它会一直等到execlp的执行完成。您似乎不了解
fork()
的效果。它创建一个单独的进程,然后独立于父进程运行。如果您打算使用
execlp()
或它的一个兄弟(您应该这样做),这正是您所需要的,但这意味着子对象不会重新进入shell输入循环。父母有。此外,父母不会等待孩子,除非你明确地告诉他这样做。否则分叉将毫无意义。@ZeroAndOne您是说您的子进程等待然后执行lps?如果是这样,那就是你的问题。父进程必须等待子进程。子进程不应该等待任何东西。@JohnBollinger forking在父进程等待子进程时也很有用,因为
exec
函数替换了进程,但您仍希望在某个时刻继续它。