linux进程管理

一、概念

1.程序:程序(program)是存放在磁盘文件中的可执行文件。

2.进程:程序的执行实例被称为进程(process)。

3.进程ID:进程都一定有一个唯一的数字标识符,称为进程PID(process ID)。进程ID总是一非负整数。(id上限65535,在每一次重新运行都是随机分配)

4.结构:linux中进程包含PCB(进程控制块)、程序以及程序所操纵的数据结构集,可分为“代码段”、“数据段”和“堆栈段”。

5.状态:

  • 运行状态R(TASK_RUNNING)
  • 可中断睡眠状态S(TASK_INTERRUPTIBLE)
  • 不可中断睡眠状态D(TASK_UNINTERRUPTIBLE)
  • 暂停状态T(TASK_STOPPED或TASK_TRACED)
  • 僵尸状态Z(TASK_ZOMBIE) 退出状态X(TASK_DEAD)

6.init进程:通常ID为1,不会终止,结束时由内核调用。它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程),但是它以超级用户特权运行。

7.获取进程标识:

  • pid_t getpid(void);     返回:调用进程的进程I D
  • pid_t getppid(void);     返回:调用进程的父进程I D
  • uid_t getuid(void);     返回:调用进程的实际用户I D
  • uid_t geteuid(void);     返回:调用进程的有效用户I D
  • gid_t getpgid(void);     返回:调用进程的实际组I D
  • gid_t getegid(void);     返回:调用进程的有效组I D

8.特点:数据独立,运行独立且随机。

二、fork系统调用

1.pid_t fork(void);     

返回:子进程中为0,父进程中为子进程I D,出错为-1

  • 由fork创建的新进程被称为子进程( child process)。    
  • 该函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是0,而父进程的返回值则是子进程的进程ID。    
  •  一般来说,在f o r k之后是父进程先执行还是子进程先执行是不确定的,这取决于内核所使用的调度算法。
  • 使用fork函数得到的子进程从父进程的继承了整个进程的地址空间

2.子进程与父进程的区别

  •  父进程设置的锁,子进程不继承          
  •  各自的进程ID和父进程ID不同            
  • 子进程的未决告警被清除;          
  • 子进程的未决信号集设置为空集

注意:fork系统调用之后,父子进程将交替执行。 如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程) 如果子出,父进程还没退出,那么子进程先退程必须等到父进程捕获到了子进程的退出状态才真正结束,否则这个时候子进程就成为僵死进程。

三、僵尸(死)进程

1.原因:

  • 当一个子进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行或者父进程调用了wait才告终止。
  • 进程表中代表子进程的数据项是不会立刻释放的,虽然不再活跃了,可子进程还停留在系统里,因为它的退出码还需要保存起来以备父进程中后续的wait调用使用。

2.解决:

  • 调用wait或者waitpid函数,此方法父进程会被挂起
  • 如果不想让父进程挂起,可以在父进程中加入一条语句:signal(SIGCHLD,SIG_IGN);表示父进程忽略SIGCHLD信号,该信号是子进程退出的时候向父进程发送的。

四、wait和waitpid函数

当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件(这可以在父进程运行的任何时候发生),所以这种信号也是内核向父进程发的异步通知。父进程可以忽略该信号,或者提供一个该信号发生时即被调用执行的函数(信号处理程序)。对于这种信号的系统默认动作是忽略它。

wait函数用于使父进程阻塞,直到一个子进程结束或者该进程接收到一个指定信号为止。

调用wait或waitpid的进程可能会:

  • 阻塞(如果其所有子进程都还在运行)。
  • 带子进程的终止状态立即返回(如果一个子进程已终止,正等待父进程存取其终止状态)。
  • 出错立即返回(如果它没有任何子进程)。

wait:

pid_t wait(int * status) ;

两个函数返回:若成功则为子进程I D号,若出错则为-1. Status选项,为空时,代表任意状态结束的子进程,若不为空,则代表指定状态结束的子进程。

waitpid:

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

  • 对于waitpid的pid参数的解释与其值有关:
  • pid == -1 等待任一子进程。于是在这一功能方面waitpid与wait等效。
  • pid > 0 等待其进程I D与p i d相等的子进程。
  • pid == 0 等待其组I D等于调用进程的组I D的任一子进程。
  • pid < -1 等待其组I D等于p i d的绝对值的任一子进程。

区别:

  • 在一个子进程终止前, wait 使其调用者阻塞,而waitpid 有一选择项,可使调用者不阻塞。
  • waitpid并不等待第一个终止的子进程—它有若干个选择项,可以控制它所等待的特定进程。
  • 实际上wait函数是waitpid函数的一个特例。

五、守护进程

  • 守护进程是在后台运行不受终端控制的进程
  • 守护进程能自动转到后台并且脱离与终端的联系
  • Linux系统中一般有很多守护进程在后台运行,执行不同的管理任务

你可能感兴趣的:(linux)