进程及其相关接口函数

一、进程

程序:静态的

是有序数据指令的集合

进程:

是系统分配资源的总称,进程是程序执行的一次完成过程(创建、调用、执行、消亡)

程序的组成:

正文段、用户数据段

1、进程的组成:

正文段、用户数据段、系统数据段(PCB(进程控制块),pc,堆栈)

PCB:

进程ID

用户名、用户组名

进程的状态、优先级

文件描述符表

pc(程序寄存器):

记录程序下一条指令的地址

堆栈(栈)

2、进程的类型

1、交互进程:跟终端相关,可以在前台进行,也可以在后台进行

2、批处理进程:跟终端无关,可以将指定的进程放在一个工作队列中按顺序进行,一般由系统管理员

3、守护进程:跟终端无关,在后台一直循环执行任务

3、进程的状态

R -- 运行态(就绪态):正在运行或者准备运行的进程

等待态:两种等待态区别在于是否能被信号打断

S -- 可中断等待态:等待某种资源,有资源之后继续执行

D -- 不可中断等待态

T -- 暂停态:暂停运行,直到有信号唤醒位置

Z -- 僵尸态:进程结束之后,没有进行资源回收,该进程状态变为僵尸态

4、进程相关指令

ps -ef :查看当前系统状态

ps -aux :查看当前系统进程,还会显示当前进程状态

top:每隔三秒,显示进程的实时信息

5、进程的优先级

进程优先级取值范围:-20 ~ 19 默认值:0

nice -n 优先等级 ./a.out //在准备运行时,将a.out的优先等级设为2

renice -n 2 进程号 //在运行过程中,将指定进程号的进程的优先级设为2

6、前后台进程切换

./a.out & //将a.out在后台运行

bg +任务号 // 将后台挂起的任务唤醒

fg + 任务号 // 将后台运行的进程切换到前台

jobs // 查看后台任务

二、进程相关接口函数

1、创建子进程--fork()

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

       pid_t fork(void);
返回值:
    成功创建一个新的子进程,父进程返回子进程的PID号,子进程返回0
    失败父进程返回-1,没有子进程被创建

父子进程:

一个进程通过fork函数创建一个新的进程,原本进程称为新进程的父进程,新的进程称为原进程的子进程

子进程会继承父进程中几乎所有的数据

1、如果父进程优先于子进程结束:

        子进程称为孤儿进程,由前台进程变为后台进程,统一由init进行收养

2、如果子进程优先于父进程结束,且父进程没有回收子进程资源:

子进程状态变为僵尸态

        一般来说,如果子进程先于父进程结束,子进程应该同意由父进程回收

子进程在fork语句的下一条指令开始执行

 

2、结束进程 -- exit() / _exit()

       #include <stdlib.h>

       void exit(int status);

参数:
	status:表示进程退出的状态

 

       #include <unistd.h>

       void _exit(int status);

注意: exit函数调用后会刷新所有缓冲区,_exit函数不会刷新

3、进程回收 -- wait 、waitpid

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

       pid_t wait(int *wstatus);
参数:
    wstatus:进程结束时,状态信息的首地址
返回值:
    成功返回结束子进程的pid号,失败返回-1
    
    如果想要得到子进程的状态信息,可以用以下宏来得到:
    
        WIFEXITED(wstatus) -- 判断一个子进程是否是正常退出,正常退出为真,非正常退出为假
   		WEXITSTATUS(wstatus)  -- 返回子进程结束的返回值
   		WIFSIGNALED(wstatus) --  判断是否被信号终止
   		WTERMSIG(wstatus) -- 打印终止进程信号的编号 
    
    

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

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

参数:
    pid:进程号, -1表示接受任意进程
    wstatus:进程结束时,状态信息的首地址
    options:
    		0 -- 以阻塞方式等待子进程结束
   		    WNOHANG  -- 以非阻塞方式等待子进程结束
    		

 

4、exec函数族

        #include <unistd.h>

l:list列表
v:argv
p:PATH环境变量
       
       int execl(const char *pathname, const char *arg, .../* (char  *) NULL */);
参数:
    pathname:执行程序的文件名(包含路径)
    arg:表示执行程序的命令行参数,命令行参数列表以NULL结尾
返回值:
    失败返回-1
    
       int execlp(const char *file, const char *arg, .../* (char  *) NULL */);

参数:
	file:程序名
        
添加环境变量:
    在~/.bashrc中添加命令
    export PATH=$PATH:/home/hqyj/class/220703_IO/day4
   		配置完成之后,需要用以下指令让配置生效:
   			source ~/.bashrc
        
        
       int execv(const char *pathname, char *const argv[]);
       int execvp(const char *file, char *const argv[]);
	

5、守护进程

守护进程跟终端无关,负责在后台周期性的处理某些事件或者等待某些事件响应

(1)进程组:当用户执行一个程序时,就相当于创建了一个进程组,跟该进程具有情缘关系的所有进程都属于该进程组

(2)会话:当用户打开一个终端时,就创建了一个会话,一个会话由一个或者多个进程组组成,一旦终端关闭,该会话中所有进程组中的进程全部结束

 

守护进程的创建流程:
		1、创建子进程,父进程退出
			fork();
		2、让子进程脱离原本会话;
            setsid();
		3、修改当前工作路径 -- 非必要
            chdir("/");
		4、重设文件权限掩码 -- 非必要
            umask(0);
		5、删除进程中所有的文件描述符
            getdtablesize();
			
			int i = 0;
			for(i = 0; i < getdtablesize; i++)
            {
                close(i);
            }
			
			while(1)
            {
                周期性需要执行的事件;
                 
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值