我编写了一个简单的程序来理解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$
请帮我纠正错误。
答案 0 :(得分: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");
}
如果您启动了多个子流程并且您有兴趣等待特定结果,则可以使用waitpid
而不是wait
,但在这种情况下,我更喜欢wait
为简单起见。
答案 1 :(得分:3)
父进程需要等待子进程完成,因此您需要调用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;