【问题标题】:How to return control form exec?如何返回控制表单执行?
【发布时间】:2013-09-26 18:23:04
【问题描述】:

这是我的代码:

void function_exists(int foo)
{
    char bar[10] = "/bin/";
    int baz;
    strncat(bar,act_arg[0],sizeof(act_arg[0]));
    if(fork() == 0)
    {
        printf("\n");
        baz = execlp(bar,act_arg[0],NULL);
        if(baz == -1)
        {
            foo++;
            wait(NULL);
        }
        else
        {
            wait(NULL);
            exit(0);
        }
    }
    fflush(stdout);
    printf("Hello");
}

我正在尝试从 execlp 返回控件,我知道它不会返回值,除非出现错误,所以我使用了 fork。但是当我执行代码时,首先打印 hello。为什么会发生这种情况?

有没有一种方法可以让 exec 返回或任何其他对我做同样事情的系统调用。现在我按下回车键,我的程序接管了,但我想这样做而不必按下回车键。

我没有足够的代表来发布图片,所以这里是我的输出的链接: http://tinypic.com/r/6szw52/5

【问题讨论】:

  • 你可以试试 popen() 而不是 exec。
  • 我查看了它并找到了一个我可以使用它的地方,所以谢谢先生

标签: c exec system-calls


【解决方案1】:

当你调用execlp时,子进程区会被execlp覆盖,所以execlp之后可用的代码不会被执行。

wait放到主循环中就可以达到想要的效果了。

检查这段代码你会得到更多的想法。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
  pid_t child;
  child = fork();
  if(child == 0) {
    printf("at child\n");
        execlp("./hello",argv[0],NULL);
    printf("after execlp in child\n\n");
    sleep(2);
  }
  else {
    wait(NULL);
    printf("parrent finish\n");
  }
  return 0;
}

printf execlp 后可用的将不会执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多