【问题标题】:How to fork() and exec() in this one?如何在这个中 fork() 和 exec() ?
【发布时间】:2010-11-14 18:01:03
【问题描述】:

我正在编写自己的 shell,但没有 fork 给我的 child_pid = 0... 有什么问题?

 while(true)
    {
        read_command(command);

        if ((child_pid = fork()) == -1)
        {
            fprintf(stderr, "can't fork\n");
            exit(1);
        }
        else if (child_pid == 0) //child
        {
            status=execl("./myShell" command);
        }
        else
        {
            wait(status); //parent
        }
    }

【问题讨论】:

  • 我不明白你的问题
  • 他的意思是:你怎么知道child_pid永远不会是0?你试过打印吗?
  • 如果不做任何事情,为什么会得到execl的返回值?
  • 假设status被声明为intwait(status)也应该是wait(&status)

标签: c++ unix system-calls


【解决方案1】:

我猜(child_pid == -1) 没有输入...是父亲(else)分支输入了两次(两个进程)还是什么?

无论如何,我看不到该 sn-p 代码中的错误。如果您确定您的执行流程到达那里,并且由于错误而具有不可预测的行为。

我怀疑 glibc 是否在您的系统上存在错误:我最好的猜测是您的程序有一个损坏的指针,它破坏了一切。这是这种非常奇怪的行为的最常见原因。

【讨论】:

    【解决方案2】:

    您的代码没问题。在if(child_pid == 0) 中添加调试打印并确保它未被调用。如果fork 无法创建子代,则设置errno 表示发生错误。

    【讨论】:

      猜你喜欢
      • 2015-12-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      相关资源
      最近更新 更多