【问题标题】:Program hangs after execvp(fork-and-exec simple console application)程序在 execvp 后挂起(fork-and-exec 简单控制台应用程序)
【发布时间】:2016-02-28 22:57:31
【问题描述】:

我尝试使用以下代码编写简单的 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 在这里输出 --

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

【问题讨论】:

  • 请以可读的方式格式化程序。无论如何,这样的编程问题在这里都是题外话。
  • 使用gcc -O2 -Wall 编译会产生大量错误和警告。在继续之前修复这些问题。修复错误后,我在这里工作正常。

标签: fork


【解决方案1】:

我相信它可以正常工作。但是,child 和 parent 的执行顺序不是您所期望的,因此您看到的输出是您不理解的。在我的 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 的输出出现在命令提示符被写出之前,因此您将看到您认为应该看到的内容。

【讨论】:

    猜你喜欢
    • 2014-06-09
    • 2015-10-13
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多