子进程中的execl()没有结束

Pra*_*dar 2 c exec

我写了一个简单的程序来理解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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我执行它时,它会显示扩展名为".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
Run Code Online (Sandbox Code Playgroud)

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

^C
srico@ubuntu:~/Desktop/c$
Run Code Online (Sandbox Code Playgroud)

请帮我纠正错误.

Jon*_*oni 6

发生的情况是父进程在子进程之前退出,并且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");
}
Run Code Online (Sandbox Code Playgroud)

如果您已经启动了几个子进程并且您有兴趣等待特定结果,那么您将使用waitpid而不是wait,但在这种情况下,我更喜欢wait简单.