二、进程的知识

文章介绍了Linux系统中的进程基础知识,包括进程与程序的区别、状态转换、进程创建(fork、vfork)、进程通信方式(管道、信号、IPC、Socket)以及进程调度。还详细讲解了进程的生命周期,如父进程与子进程的关系、孤儿进程和僵尸进程的处理,以及exec族函数在启动新进程中的作用。最后,讨论了守护进程的概念及其创建步骤。
摘要由CSDN通过智能技术生成

一、基础知识

进程是指正在运行的程序,是资源分配的最小单位。是一个动态的概念。

程序是静态的。

ps查看正在运行的进程,一个进程可以有多线程,同一进程里面的线程共享此进程的同一资源

每个进程都有一个唯一的标识符,既进程 ID,简称 pid 进程间的通信的几种方法? 1 管道通信:有名管道,无名管道 2 信号通信:信号的发送,信号的接受,信号的处理 3 IPC 通信:共享内存,消息队列,信号灯 4 Socket 通信 进程的三种基本状态以及转换

执行:正在占用cpu

就绪:已经具备一切运行条件,等待分配cpu处理时间片

等待:进程不能使用cpu,等待事件发生则可以将其唤醒

linux系统是一个多进程的系统,他的进程之间具有并行性,互不干扰

多用户、多任务

Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现代电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。

进程互斥:若干进程都要使用同一块共享资源,任何时刻最多允许一个进程使用

临界资源:一次只允许一个进程访问的资源

临界区:进程中访问临界资源的那段代码

死锁:多个进程因进程资源造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进

进程调度:按一定算法,从一组待运行的进程中选出一个来占有cpu运行

调度方式:

  1. 抢占式

  1. 非抢占式

二、进程

所有的进程都是由其他进程创建(除了 pid 为 0 号的 idle 进程),pid 号为 1 的 init 进程是系统启动后 运行的第一个进程,是所有进程的父进程,init 进程会初始化一部分系统服务,创建其他进程。

父进程:创建新进程的进程

子进程:被创建的进程

父进程和子进程拥有相同的代码段数据段,有各自独立的地址空间。采用写时拷贝技术,即创建的新进程不会立即把父进程的资源空间复制过来,只有在修改时才会复制资源,另外父进程挂起的信号和文件锁不会被子进程继承。

子进程结束后,它的父进程要回收它的资源,否则就会成为僵尸进程 。

如果父进程先结束,子进程会被 init 进程收养,称为孤儿进程。

pid_t getpid(void)

获取本进程id号

pid_t getppid(void);

获取父进程

pid_t fork(void)

调用成功父进程返回子进程号,子进程返回 0,失败返回-1。

pid_t pid;
pid = fork();
pid_t vfork(void)

创建子进程

vfork()会产生一个新的子进程,其子进程会共享父进程的数据与堆栈空间,并集成父进程的用户代码等

注意:vfork产生的子进程一定是子进程先执行,父进程后执行

vfork产生的父子进程共享地址空间,使用同一块地址空间,进程号不一样

vfork用来启动不相关的进程

三、exec族函数

exec用于启动一个不想管的新进程,被执行的程序替换调用它的程序

exec和fork区别

  1. fork创建一个新进程,产生一个新的pid

  1. exec启动一个新程序,替换原有的进程,因此进程pid不会改变

一个进程启动另一个进程。使用vfork

用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序,该子进程被新的程序 替换,改变地址空间,进程映像和一些属性,但是 pid 号不变。exec 函数详解如下表所示:

int execve(const char *filename, char *const argv[], char 
*const envp[]);

filename:路径名,表示载入进程空间的新程序路径

argv:命令行参数

envp:新程序的环境变量

intnt execl(const char *path, const char *arg, .../* (char *) NULL *

execl("/home/samba/linux/15/hello","hello",NULL);

四、孤儿进程和僵尸进程

孤儿进程:父进程结束以后,子进程还未结束,这个子进程就叫做孤儿进程。 僵尸进程:子进程结束以后,父进程还在运行,但是父进程不去释放进程控制块,这个子进程就叫做僵尸 进程

子进程父进程变成了祖先进程(1)

父进程负责产生子进程,最后回收子进程资源

父进程产生子进程但是没有回收子进程资源:孤儿进程

s睡眠

z僵尸

僵尸进程杀不死

回收子进程

wait()父进程中使用

1、等待子进程结束

2、回收子进程资源

pid_t wait(int *status
)

与 wait 函数的参数有关的俩个宏定义: WIFEXITED(status):如果子进程正常退出,则该宏定义为真 WEXITSTATUS(status):如果子进程正常退出,则该宏定义的值为子进程的退出值。

在程序中,使用 wait()函数,防止僵尸进程的产生

wait()有一个子进程结束父进程就结束

waitpid()指定子进程等待

五、守护进程

守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引 导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。

用户使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被 其他的用户使用。例如,用户从一个终端启动守护进程后退出,然后另外一个人也登录到这个终端。用户 不希望后者在使用该终端的过程中,接收到守护进程的任何错误信息。同样,由终端键入的任何信号(例如 中断信号)也不应该影响先前在该终端启动的任何守护进程的运行。虽然让服务器后台运行很容易(只要 shell 命令行以&结尾即可),但用户还应该做些工作,让程序本身能够自动进入后台,且不依赖于任何终端。 守护进程没有控制终端,因此当某些情况发生时,不管是一般的报告性信息,还是需由管理员处理的 紧急信息,都需要以某种方式输出。Syslog 函数就是输出这些信息的标准方法,它把信息发送给 syslogd 守 护进程。

2.怎么创建一个守护进程? 有个基本要求: 1. 必须作为我们 init 进程的子进程 2. 不跟控制终端交互。 步骤: 1.使用 fork 函数创建一个新的进程,然后让父进程使用 exit 函数直接退出(必须要的) 2.调用 setsid 函数。(必须要的) 3.调用 chdir 函数,将当前的工作目录改成根目录,增强程序的健壮性。(不是必须要的) 4.重设我们 umask 文件掩码,增强程序的健壮性和灵活性(不是必须要的) 5.关闭文件描述符,节省资源(不是必须要的) 6.执行我们需要执行的代码(必须要的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值