嵌入式培训经验分享——进程的创建和释放

这篇博客介绍了如何在Unix/Linux系统中使用fork()创建新进程,以及如何通过exit()和wait()函数来释放和回收子进程。文章详细阐述了fork()函数的工作原理,以及exit()如何导致进程成为僵尸进程,强调了wait()在父进程回收子进程中的重要作用。
摘要由CSDN通过智能技术生成

1、如何创建一个新的进程:

        使用fork()函数:

        使用fork函数可以产生一个与父进程一模一样的新的进程,称为子进程,同时两个进程之间可以执行不同的任务。

#include <stdio.h>

int main()
{
	int aa = 0;
	printf("I am process pid=%d ppid=%d\n", getpid(),getppid() );
	/*
		int fork();
	*/
	int pid = fork();
	if(pid >0){
		while(1){
			aa++;
			printf("I am father pid=%d ppid=%d\n",getpid(),getppid());
			sleep(1);
		}
	}else if(pid==0){
		while(1){
			printf("I am child pid=%d ppid=%d\n",getpid(),getppid());
			printf("child aa=%d\n",aa);
			sleep(1);
		}
	}
}

    2、如何将创建的进程释放:

使用exit()函数结束进程,但是在结束进程之后,进程并没有被完全回收,会成为一个僵尸进程,需要等待父进程去完全回收释放。

#include <stdio.h>

int main()
{
	int aa = 0;
	printf("I am process pid=%d ppid=%d\n", getpid(),getppid() );
	/*
		int fork();
	*/
	int pid = fork();
	if(pid >0){
		while(1){
			aa++;
			printf("I am father pid=%d ppid=%d\n",getpid(),getppid());
			sleep(1);
            exit(0);
		}
	}else if(pid==0){
		while(1){
			printf("I am child pid=%d ppid=%d\n",getpid(),getppid());
			printf("child aa=%d\n",aa);
			sleep(1);

		}
	}
}

3、父进程对子进程进行完全回收释放:

        使用wait()函数,在对wait()函数的使用中,如果子进程已经自己释放了自己,则父进程直接对子进程进行完全释放,如果子进程没有对自己进行释放,则父进程会被阻塞等待子进程的释放,再进行完全释放。

        父进程调用wait,阻塞(卡在那里)的等待  任意子进程结束,
        一旦某个子进程结束,wait立马返回,获取孩子的进程号和死亡状态,并完成收尸过程
        #include <sys/types.h>
       #include <sys/wait.h>
        pid_t  wait(int *status);
            status存放 子进程exit()传参
                    exit的传参是一个 char数据,存放在了 wait参数的8-15bit
            返回值: 死亡孩子的pid
            用法: 一般当父进程想自我了解的时候,最后一步调用wait ,当所有子进程结束,父进程结束.


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/wait.h>

int main()
{
	
	printf("main process pid=%d\n",getpid());
	
	pid_t pid = fork();
	if(pid<0){
		perror("fork err");
		return -3;
	}
	
	if(pid==0){
		printf("sub process pid=%d ppid=%d\n",getpid(),getppid());
		int n=5;
		while(1){
			n--;
			if(n==0){ exit( 11 );}  //自杀,向父亲传递一个值
			printf("I am 1st subprocess \n");
			sleep(1);
		}
	}

	int dead_stat;
	pid_t subpid = wait(&dead_stat);
	printf("find subprocess %d  stat=%d\n",subpid, (dead_stat&0xFF00)>>8);
	
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值