【问题标题】:execl() in child process doesn't end子进程中的 execl() 没有结束
【发布时间】:2013-07-04 06:16:51
【问题描述】:

我写了一个简单的程序来理解 execl() 的概念。这是我的程序

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

int main()
{
    pid_t pid;
    pid = fork();
    if(pid == 0)
    {
        execl("/bin/sh","sh","-c","ls -l *.c", NULL);
    }
}

当我执行它时,它会显示扩展名为“.c”的文件列表。但是,子进程似乎没有结束,光标一直在闪烁。

srico@ubuntu:~/Desktop/c$ -rw-rw-r-- 1 srico srico   84 Jun 30 08:30 cmdacc.c
-rw-rw-r-- 1 srico srico  138 Jul  4 11:08 execfun.c
-rw-rw-r-- 1 srico srico  343 Jul  4 10:27 execvp1.c
-rw-rw-r-- 1 srico srico  167 Jun 23 08:20 filechar.c
-rw-rw-r-- 1 srico srico  195 Jun 23 11:20 fileline.c
-rw-rw-r-- 1 srico srico  203 Jun 27 07:17 filestat.c
-rw-rw-r-- 1 srico srico  112 Jun 22 11:11 new.c
-rw-rw-r-- 1 srico srico  304 Jun 27 12:09 parchild1.c
-rw-rw-r-- 1 srico srico 1038 Jun 27 10:56 parchld.c

我必须使用 ctrl+c 手动终止进程。

^C
srico@ubuntu:~/Desktop/c$

请帮我改正错误。

【问题讨论】:

  • 它为我退出。我首先得到提示,然后是输出。再次按 Enter 会得到另一个提示。
  • 我看到它对你也一样。你已经在第一行得到了提示。

标签: c exec


【解决方案1】:

发生的情况是父进程在子进程之前退出,并且 shell 在子进程写入其输出之前写入提示。当您按下 control-c 时,子进程已经退出,shell 会改写提示。您可以按 Enter 键获得相同的效果。

要解决此问题,您可以使用wait 函数让父进程等到子进程退出:

if (pid == 0) {
    execl("/bin/sh", "sh", "-c", "ls -l *.c", NULL);
} else if (pid > 0) {
    wait(NULL); /* wait for child */
} else {
    /* it was not possible to create child process, so print error message */
    perror("fork failed");
}

如果您启动了多个子进程并且您有兴趣等待特定子进程的结果,您可以使用waitpid 而不是wait,但在这种情况下,为了简单起见,我更喜欢wait

【讨论】:

    【解决方案2】:

    父进程需要等待子进程完成,所以需要调用waitpid(),如下图。其余代码用于更好地处理错误。

    int status;
    pid = fork();
    if (pid == 0)
    {
        /* child process.  shell command execution. */
        execl("/bin/sh", "sh", "-c", "ls -l *.c", NULL);
        _exit(EXIT_FAILURE);
    }
    else if (pid < 0)
        /* The fork failed.*/
        status = -1;
    else
        /* parent process.  Wait for child to complete.  */
        if (waitpid(pid, &status, 0) != pid)
            status = -1;
    return status;
    

    【讨论】:

    • 其在评论中等待子进程的完成。
    • 确实如此。但这是解决 OP 问题的关键,而您在评论中隐藏了解释...
    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多