进程以及进程创建的知识点总结

一、进程

1、进程相关指令

ps -ef:查看当前系统的进程
ps -aux:查看进程,还可以查看进程状态
top:每隔三秒显示进程的实时信息
kill -9 [PID]:表示杀死进程

2、进程的优先级

​ 进程优先级取值范围(-20 ~19),默认值为0,值越小优先等级越高
​ nice -n 优先等级 ./a.out //在准备运行时,将a.out的优先等级修改为你需要的优先等级 renaic -n 2 进程号 //在运行过程中,将指定的进程号的优先级设为2

3、前后台进程的切换

​ ./a.out & 表示将./a.out在后台运行
​ bg + 任务号 表示将后台挂起的进程唤醒
​ fg + 任务号 将后台运行的进程切换为前台进程
​ jobs:查看后台任务
​ kill -9 进程号 杀死这个进程

二、进程相关接口函数

1、创建子进程----fork
#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);
参数:
    
返回值:
    
	成功创建一个新的子进程,原本的父进程会得到子进程的ID号,子进程返回0
    失败父进程返回-1,没有子进程被创建

父子进程:
​ 一个进程通过fork函数创建一个新进程,原本进程成为新进程的父进程,新的进程称为原进程的子进程。
​ 子进程会继承父进程中几乎所有数据(局部变量、文件描述符)。
​ 进程之间的物理地址是相互独立的,PC 堆栈都是独立的。

1、如果父进程优先于子进程先结束:
​ 子进程(称为孤儿进程)不会立即结束,由前台进程变为后台进程,并且统一由init进程收养(init进程称为初始进程)

2、如果子进程优于父进程先结束:
​ 父进程没有回收子进程资源,子进程变为僵尸态,杀不死(占资源,不响应)。
​ 一般来说,如果子进程先于父进程结束,子进程应该统一由父进程回收。

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

2、结束进程----exit() / _exit()
 #include <stdlib.h>
       void exit(int status);
参数:
	status:表示进程退出的状态
 #include <unistd.h>
       void _exit(int status);
参数:
	status:表示进程退出的状态

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

3、进程回收----wait / waitpid
1、wait
#include <sys/types.h>
#include <sys/wait.h>
   pid_t wait(int *wstatus);

参数:
    wstatus:表示进程结束时,状态信息的首地址
返回值:
    成功返回结束子进程的pid号,失败返回-1
              
     如果想要得到子进程结束的状态信息,可以用于一下宏来得到:
        WIFEXITED(wstatus)--判断一个子进程是否正常退出,正常退出为真,非正常退出为家
        WEXITSTATUS(wstatus)--返回子进程结束的返回值
        WIFSIGNALED(wstatus)--判断信号是否被终止
        WIERMSIG(wstatus)--打印终止进程信号的编号
        
2、waitpid
 #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结尾
    
返回值:
    失败返回-1int execlp(const char *file, const char *arg, .../* (char  *) NULL */);
参数:
    file:程序名
添加环境变量:
    在~/.bashrc中添加命令
    export PATH = $PATH:/home/hqyj/220703/IO/day4-----file所在的路径
    配置完成之后,需要用以下指令让配置生效:
   			source ~/.bashrc
----------------------------------------------------------------------------------------
      int execv(const char *pathname, char *const argv[]);
      int execvp(const char *file, char *const argv[]);
5、守护进程

​ 守护进程跟终端无关,负责在后台周期性的处理某些事件或者等待某些事件响应
(fork创建的都是交互进程)
(1)进程组:当用户执行程序时,就相当于创建了一个进程组,跟该进程具有亲缘关系的所有进程,都属于该进程
(2)会话:当用户打开一个shell终端诗,就常见了一个会话。一个人会话有一个或者多个进程组组成,该会话中所有进程组中的进程全部结束

守护进程的创建流程:

1、创建子进程,父进程突出
fork()2、让子进程脱离原本会话
    setsid();//没有参数

3、修改当前工作路径-----非必要
    chdir("/tmp");//路径
4、重设文件掩码-------非必要
    umask(0);
5、删除进程中所有的文件描述符(整型值)
	int i = 0;
	for(i = 0; i< detablesize; i++)
	{
 		close(i);   
	}
	while1{
  	  周期性需要执行的事件;
	}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值