linux进程管理基础知识

3 篇文章 0 订阅

进程

进程介绍

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

PCB中包含以下内容:

(1)进程id

(2)进程的状态,运行、挂起、停止、僵尸等

(3)进程切换时需要保存和恢复的一些CPU寄存器

(4)描述虚拟地址空间的信息

(5)描述控制终端的信息

(6)当前工作目录

(7)umask掩码

(8)文件描述符表,包含很多指向file结构体的指针

(9)和信号相关的信息

(10)用户id和组id

(11)控制终端、Session和进程组

(12)进程可以使用的资源上限

 

程序和进程的区别

    程序是一个普通的文件,是机器代码指令和数据的集合,程序是静态的实体。

    进程在操作系统中指向特定的任务,进程是出于活动状态的计算机程序。进程是程序的一次执行

 

进程状态

运行状态          R

可中断睡眠状态     S

不可中断睡眠状态   D

暂停状态          T

僵死状态          Z

退出状态          X

 

 

进程标识

头文件

#include <sys/types.h>

#include <unistd.h>

函数原型

pid_t getpid(void);//返回自己的进程ID

pid_t getppid(void);//返回自己的父进程ID

pid_t getuid(void);//返回进程的实际用户ID

pid_t geteuid(void);//返回进程的有效用户ID

pid_t getgid(void);//返回进程的实际组ID

pid_t getegid(void);//返回进程的有效组ID

 

 

进程创建

复制进程映像(fork)

fork函数用于从已存在的进程中创建一个新进程,这个进程就是子进程,原进程为父进程

头文件

#include <sys/types.h>

#include <unistd.h>

函数原型

pid_t fork(void);

返回值

0:子进程 

大于0:父进程

-1:出错

 

exit和_exit

exit和_exit都是终止进程的,调用后会无条件的停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止进程的运行

exit():

头文件

#include <stdlib.h>

函数原型

void exit(int status);

 

_exit():

头文件

#include <unistd.h>

函数原型

void _exit(int status);

 

exit 和 _exit中的status是一个整型参数,可以利用这个参数传递进程结束时的状态,0表示正常退出,其他数值表示出现了错误,进程非正常退出。

实际编程过程中可用wait系统调用接收子进程的返回值,从而针对不同情况进程不同处理

 

exit 和 _exit区别

_exit的作用是 1.清除这个程序使用的内存空间,2.清除他在内核中的各种数据结构,3. 终止程序

exit的作用 1.检查文件的打开情况,把文件缓冲区中的内容写会文件 2. 清除这个程序使用的内存空间,3.清除他在内核中的各种数据结构,4. 终止程序

 

wait和waitpid

wait函数用于父进程阻塞,直到一个子进程结束或者该进程接到一个指定的信号为止。(如果这个父进程没有子进程或者子进程已经结束,则wait就会立即返回)

头文件

#include <sys/types.h>

#include <sys/wait.h>

函数原型

pid_t wait(int *status)

参数

参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。

如果我们对子进程如何死的不感兴趣,我们就可以设定这个参数为NULL:

pid = wait(NULL);

如果我们有必要知道子进程如何死可以使用下面的宏:

WIFEXITED     子进程正常退出,返回非零值

WEXITSTATUS       如果WIFEXITED非零,返回进程退出码

WIFSIGNALED       子进程因未捕获信号而终止,返回非零

WTERMSIG      如果WIFSIGNALED非零,返回信号代码

WIFSTOPPED    如果子进程终止,返回非零

WSTOPSIG      如果WIFSTOPPED非零,返回一个信号代码

 

返回值

如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。

 

 

waitpid作用和wait一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如:提供一个非阻塞版本的wait功能,也能支持作业控制。实际上wait是waitpid的一个特例

头文件

#include <sys/types.h>

#include <sys/wait.h>

函数原型

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

参数

pid:

    pid==-1 等待任意子进程。于是在这一功能方面waitpid和wait等效。

    pid>0  等待进程ID为pid的这个子进程

    pid==0   等待其组ID等于调用进程的组ID的任一子进程

    pid<-1 等待其组ID等于pid的绝对值的任一进程

status:同wait

options:

    WHNOHAND 若由pid指定的子进程不立即可用,则waitpid不阻塞,此时返回值为0

    WUNTRACED 若实现某支持作业控制,则由pid制定的任一子进程状态已暂停,且其状态自暂停一来还未报告过,则返回其状态

    0   同wait,阻塞父进程,等待子进程退出

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值