僵尸进程:
子进程退出,父进程不为子进程wait(释放子进程的资源)
问:为什么需要父进程来为子进程释放资源
父子进程是两个不同的进程(独立的空间),父需要需要得到子进程的退出状态,所以需要父进程来释放
问:如何释放
父进程调用wait来释放。
代码实现
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
void main()
{
int pid=fork();
if(pid>0)//父进程
{
printf("父进程:%d,睡眠40s\n",getpid());
sleep(40);
printf("父进程醒了...\n");
wait(NULL);
sleep(100);
}
else if(pid==0)//子进程
{
printf("子进程:%d,运行结束\n",getpid());
exit(0);
}
}
孤儿进程:
父进程先于子进程退出
(应用于精灵进程/守护进程/后台进程)
PS:由于父进程先于子进程退出,所以该子进程的父进程成为1号进程,该子进程退出后就会向1号进程发送退出信号,1号进程收到就会释放资源。
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void main()
{
int pid=fork();
if(pid>0)//父进程
{
printf("我是父进程:%d,即将退出....\n",getpid());
exit(0);
}
else if(pid==0)
{
printf("我是子进程:%d\n",getpid());
sleep(1);
printf("我是子进程:%d,我的父进程:%d\n",getpid(),getppid());
}
}
ps查看进程
ps -e查看进程列表
execv函数族:
用于执行指定的可执行文件
int execl(const char *path, const char *arg, …);
int execlp(const char *file, const char *arg, …);
int execle(const char *path, const char *arg,
…, char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
PS:
1、
带有p后缀,从系统路径下执行文件可执行文件
//系统路径下, 带p
printf("我是execl的程序\n");
//execlp("ls","ls","/",NULL);
//char* argv[] ={"ls","-l","/",NULL};
char* argv[] ={"mytest","mytest",NULL};
execvp("./mytest",argv);
printf("我执行结束啦\n");
不带有p后缀,从用户指定路径执行,若不指定路径则去系统路径下查找,若指定路径则从指定路径下查找。
printf("我是execl的程序\n");
//执行mytest
execl("./mytest","mytest",NULL);
printf("我执行结束啦\n");
2、
带v后缀:执行可执行文件的用户参数列表通过数组传递,数组元素的最后一个元素必须是NULL
带l后缀:通过可变形参传递,最后一个形参必须是NULL
3、
若上述函数执行可执行文件成功时,就会将该可执行文件的程序替换本进制的程序代码区
4、
若该进程不被可执行文件替换,可以交给子进程执行。
int pid=fork();
if(pid>0)//父进程
{
printf("我是父进程,执行ls命令\n");
//等待子进程
wait(NULL);
printf("我执行结束啦\n");
}
else if(pid==0)//子进程
{
//为什么需要交给子进程来执行ls命令,只会替换子进程空间
execlp("ls","ls","-l","/",NULL);
}
头文件