进程的概念及简单实现

进程 :是一个动态空间(从程序的开始执行(创建进程),直到程序结束),也就是程序的一次执行过程。进程还有其他名称:

        1、可以独立参与调度的任务

        2、申请资源和释放资源的总称

进程与程序的区别

        程序:程序是静态的,只是存在于磁盘上的命令的集合

        进程:进程是动态的,负责程序的创建、调度、执行、消亡(释放)等过程

         而管理进程的叫做进程管理器(负责向内核进行空间的申请资源)

  如何识别不同的进程呢?通过进程的进程号(PID)          PID:唯一进程号标识着一个进程

进程分类:

        1、交互进程(前后台进程)

                由Shell控制和允许,可以是前台进程,也可以是后台进程。

                        后台进程:程序中主循环内的程序,无优先级一直循环工作的程序。

                        前台进程:程序中发生中断不执行当前循环内的程序,而是执行中断程序。

        2、批处理进程(一次性处理多个进程)

                 进程不属于终端,一次性处理多个任务,提交到一个队列顺序执行

        3、守护进程

                一般在后台执行,属于一种特殊的任务(进程)。一般开机执行,关机结束

系统管理

进程的执行状态

1、就绪态(运行态):  下一个要执行的程序或者任务

2、等待态(): 进程正在等待某个事件产生或某个资源,才可以执行(可中断与不可中断)

3、停止态: 进程被中止

4、僵尸态(死亡态):这时,是一个终止状态,等待资源回收而已

进程的模式

        进程执行时有两种模式:用户模式内核模式。

        用户模式既自己写的程序,内核模式则是调用内核的程序。

进程执行

       在Linux中,如果要执行一个程序,变为进程(创建进程),需要依靠其他正在执行的进程,创建进程需要其他进程。

        被创建的进程叫做子进程,去执行创建的进程叫做父进程(一个执行程序调用其他函数库,执行程序为父进程,而调用的函数库为子进程)

以下是创建父子进程所需要的函数   

1、fork()创建函数

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

pid_t fork(void);

    创建的子进程,从fork()后面开始运行,父进程执行全部程序,创建子进程会有返回值

返回值: pid_t

    成功:在父进程中返回子进程的pid号,在子进程中返回0.
    失败:在父进程中 -1

2、获得当前进程的pid号

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

pid_t getpid(void);//返回当前执行进程的pid

pid_t getppid(void);//返回当前执行进程的父进程的pid

3、结束当前进程

结束当前进程 

#include <stdlib.h> 
void exit(int status);====等价于 main函数 return xxx;


#include <unistd.h> 
void _exit(int status); 

参数:
    参数1:int status//:结束状态,表示当前进程的结束状态,把结束状态提供给父进程

区别:exit会在结束进程,把所有文件的缓冲区刷新,_exit结束就是直接结束 

4、等待进程结束

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

//等待任意的子进程结束,哪个子进程结束就回收谁,获取子进程的结束状态 

pid_t wait(int *wstatus); 

参数:
    参数1:int *wstatus//:指针,地址,把子进程的结束状态存储到这个地址中,如果不需要子进程的结 束状态,参数写NULL 

返回值:pid_t 
    成功:返回等待到的结束子进程的pid 
    失败:错误 返回-1 

pid_t waitpid(pid_t pid, int *wstatus, int options); 

参数:
    参数1:pid_t pid//:等待哪个子进程 -1:等待任意子进程 >0:等待指定值为pid的进程 
    参数2:int *wstatus//:指针,地址,把子进程的结束状态存储到这个地址中,如果不需要子进程的结 束状态,参数写NULL 
    参数3:int options://选项 
        WNOHANG:非阻塞等待,如果当前有子进程结束就回收,如果在执行waitpid时没有子进程结 束,函数就立即结束不等待 
        0:阻塞等待,一直阻塞等待有子进程结束

例程:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>


int main()
{
	
	pid_t pid = 0;
	
	pid = fork();
	if(pid == 0)
	{
		printf("1 child\n");
		sleep(4);
		printf("1 pid %d\n",getpid());
		exit(0);
	}
	else if(pid > 0)
	{
		pid = fork();
		if(pid == 0)
		{
			printf("2 child\n");
			sleep(2);
			printf("2 pid %d\n",getpid());
			exit(0);
		}
	}

	printf("this is parent\n");	
	sleep(5);
	pid = waitpid(-1,NULL,WNOHANG);
	printf("child pid is %d\n",pid);

	return 0;
}

执行结构为

this is parent
2 child
1 child
2 pid 36105
1 pid 36104
status is 100
child pid is 36104

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啵啵520520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值