进程控制 僵尸进程 孤儿进程 execv函数族

僵尸进程:

子进程退出,父进程不为子进程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);
	}

头文件
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值