linux环境 使用system()函数启动的进程,如何检测当前进程是否退出
时间: 2024-02-05 20:13:53 浏览: 25
可以使用waitpid()函数来检测子进程的退出状态。waitpid()函数会挂起当前进程,直到指定的子进程退出为止。
具体步骤如下:
1. 在启动子进程时,使用fork()函数创建一个子进程。
2. 在子进程中使用exec()函数执行要启动的程序。
3. 在父进程中使用waitpid()函数等待子进程退出。
4. 如果waitpid()函数返回的状态值为0,则表示子进程还在运行。
5. 如果waitpid()函数返回的状态值大于0,则表示子进程已经退出,并且可以通过WEXITSTATUS()宏获取子进程的退出状态。
6. 如果waitpid()函数返回的状态值小于0,则表示出现了错误。
下面是一个示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int status;
pid = fork();
if(pid < 0)
{
perror("fork failed");
exit(EXIT_FAILURE);
}
else if(pid == 0)
{
// 子进程
execl("/bin/ls", "ls", "-l", NULL);
exit(EXIT_SUCCESS);
}
else
{
// 父进程
while(waitpid(pid, &status, WNOHANG) == 0)
{
printf("子进程还在运行...\n");
sleep(1);
}
if(WIFEXITED(status))
{
printf("子进程正常退出,退出状态为:%d\n", WEXITSTATUS(status));
}
else if(WIFSIGNALED(status))
{
printf("子进程异常退出,退出信号为:%d\n", WTERMSIG(status));
}
}
return 0;
}
```
在上面的示例代码中,我们使用了WNOHANG标志,表示waitpid()函数在子进程退出之前不会挂起当前进程。这样可以避免当前进程一直阻塞在waitpid()函数中,导致无法响应其他事件。