程序在execvp(fork-and-exec简单控制台应用程序)之后挂起

时间:2016-02-28 22:57:32

标签: fork

我尝试使用以下代码编写简单的fork-and-exec应用程序

#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>

int
spawn(char *program, char *arg_list[])
{
  pid_t child_pid;

  child_pid = fork();
  if (child_pid != 0)
    return child_pid;
  else {
        execvp(program, arg_list);
    fprintf(stderr, "an error occured\n");
    exit(EXIT_FAILURE);
  }
}

int
main()
{
  int child_stat;

  char *arg_list[] = {
    "ls",
    "-l",
    "/",
    NULL
  };

  spawn("ls", arg_list);
  printf("return to parent\n");
  return 0;
}

一切顺利,但是成为ls后的孩子不会终止。 壳看起来像 。/主要 回到父母 - 这里输出ls -

但是命令提示符没有出现,所以我假设一个进程挂起,原因对我来说并不明显。请你指出我的错误。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我相信它运作正常。但是,子项和父项的执行顺序不是您所期望的,因此您会看到您不理解的输出。在我的Arch linux框(内核4.xx)上,它工作正常,但父进程首先返回,让ls覆盖并以其他方式使命令提示符乱码。对子进程执行wait()以按特定顺序执行执行。在spawn()电话后添加几行代码:

  spawn("ls", arg_list);
  printf("return to parent\n");
  wait(&child_stat);
  printf("Waited on child\n");
  return 0;

fork()调用之后,父进程将调用wait(),直到子进程(如果至少有一个)退出时才会返回ls。由于只有一个子进程,{<1}}的输出在命令提示符被写出之前发生,因此您将看到您认为应该看到的内容。