跳转至

进程

文件锁

进程锁

  • 进程锁:记录一个PID文件,避免两个进程同时运行的文件
    • 与线程锁、互斥量和自旋锁不同

      如果两个进程一起执行可能会出问题

  • 作用:协调进程的运行

孤儿进程

  • 孤儿进程:指其父进程执行完成或被终止后仍然继续运行的进程
    • 即父进程不在了,子进程还在运行
  • 作用:刻意使进程称为孤儿进程,这样可以使其与其父进程回话脱钩,成为[[Reading/Understand-Linux-Process/进程#守护进程|守护进程]]

僵尸进程

当一个程序完成它的工作并且终止的时候,其父进程需要调用wait()waitpid()来获得子程序的终止状态 - 如果子进程退出,而父进程没有调用这两个函数来获取子进程的状态信息,那么子进程的进程描述符就会一直保存在系统中,这样的进程称为僵尸进程 死不瞑目

守护进程

  • 守护进程:后台服务进程
    • 有一个很长的生命周期来提供服务,关闭中断并不会影响到该服务的进行

守护进程的实现

  1. 在启动程序后面添加&
  2. 进程自己fork()然后结束父进程
    if(pid = fork()){
        exit(0);
    }
    
  3. 与终端、进程组、会话分离
    • 子进程一般都会从父进程继承这些信息,与环境分离的方法:setsid()
    • 同样的会进程文件掩码,手动清除掩码的方法:umask(0)

      每一个进程在创建的时候都会绑定一个终端,并且属于一个进程组(进程组有GID,并且GID=进程组长的PID),这些进程组在一个会话中,如果是子进程一般都会从父进程继承这些信息

使用Nohup

  • 使用nohup命令,让程序以守护进程运行
    • 程序运行后忽略SIGNUP信号->终端的关闭不会影响进程的运行

      类似的命令还有disown

进程间通信

进程间通信

IPC(Interprocess Communication),指进程间协作的各种方法,包括共享内存、信号量或Socket

管道(Pipe)

管道是进程间通信的最简单方式,任何京城的标准输出都可以作为其他进程的输入

信号(Signal)

  • 是进程间通信的一种方法
    • 同样可以用于内核给进程发送信息
  • 告诉进程发生了什么事件,而不会传递任何数据

信号种类

$ kill -l
HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHL

在命令行中止一个程序我们一般摁Ctrl+c,这就是发送SIGINT信号,而使用kill命令呢?默 认是SIGTERM,加上-9参数才是SIGKILL

消息队列(Message)

和传统消息队列类似,但是在内核实现

共享内存(Shared Memory)

信号量(Semaphore)

  • 一个整型计数器

    调用wait时计数器-1,减到0时开始阻塞进程,从而达到进程、线程间的协作

套接口(Socket)

也就是通过网络来通信,这也是最通用的IPC,不要求进程在同一台服务器上