进程

一、什么是进程

1)从用户角度来看,进程是程序一次动态执行的过程。

2)从操作系统角度:硬件上有中断技术出现,产生了分时系统。

进程是操作系统分配资源的基本单位。

进程是操作系统分配资源的最小单位。

进程有自己的运行状态和(虚拟的)地址空间。

3)进程和程序的比较:

  • 进程是动态的运行过程,程序是静止的。
  • 进程有PCB,程序没有。
  • 进程是短暂的,程序相对永久。
  • 一个进程只能对应一个程序,一个程序可以对应多个进程。
  • 程序:代码+数据
  • 进程:代码+数据+堆栈+PCB(PCB中有pc 和esp,所以栈中数据和代码段内容可以在一

    块配合使用)

二、进程状态

1)三态:就绪态,运行态,阻塞态

2)七态:用户运行态,(内核6个)运行态,就绪态,可中断睡眠,不可中断睡眠 ,僵尸状态,暂停状态

  七种状态的转换关系:

 

三、进程创建

1.分配进程标识符

2.创建PCB

3.复制父进程的环境

4.给子进程分配内存空间,将父进程的数据拷贝到该地址空间(修改EIP)

5.将子进程设置成就绪状态,放入就绪队列。

linux系统创建进程的系统调用:

int fork ( void )

每个进程都会在 / proc / pid装上自己的信息(是虚拟的,不会占用空间)


  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 
  5 int g_data = 10;
  6 
  7 int main( void )
  8 {
  9     if ( fork() == 0 ) {
 10         g_data = 250;
 11         printf("child &g_data=%p,g_data = %d\n", &g_data, g_data);
 12     } else {
 13         sleep(1);
 14         printf("parent &g_data=%p, g_data = %d\n", &g_data,g_data);
 15     }
 16 }

  

 

 由上面的结果可以得知:父子进程的虚拟地址空间地址是一样的,但是物理地址是不一样的。

子进程继承父进程的内容:

  • 优先级
  • 环境environment
  • 堆栈
  • 共享内存
  • 打开的文件描述符(父进程的文件描述符子进程可以使用)
  • 执行时关闭标志
  • 信号控制设定
  • 进程组号
  • 当前工作目录
  • 根目录
  • 文件方式创建屏蔽字
  • 资源限制
  • 控制终端
  • 用户号UIDs和用户组GIDs

子进程独有的东西:

  • 进程PID
  • 不同的父进程号
  • 自己的文件描述符和目录流的拷贝
  • 异步输入和输出
  • 父进程和子进程拥有自己独立的地址空间和PID参数

fork:

1.fork之后,父子进程交替运行

2.父进程死亡,子进程成为孤儿进程(孤儿进程被1号init进程来收养它,自动回收资

源)

3.如果子进程先死亡,子进程成为僵尸进程(僵尸进程有害)

vfork与fork的区别

1.子进程先执行,创建子进程同时阻塞父进程,等子进程运行结束了父进程才能运行

2.写时都不拷贝

3. vfork后面必须有exit或exec,否则出错。

四、回收僵尸子进程

pid_t wait(int *status)

// wait 是阻塞函数,直到有子进程死亡

//waitpid() 回收僵尸子进程

// status : 获得子进程的死亡信息

// 返回值(成功):被回收的子进程的进程ID

WIFEXITED(s) :// 返回真表示正常退出

WEXITSTATUS(s); //获得退出码(前提要保证程序是正常退出,即WIFEXITED(s)为真)

WIFSIGNALED(s) //不能正常退出返回真

函数

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

pid > 0:本进程的子进程

pid = 0:调用者进程所在进程组的任何一个子进程死亡都会回收

进程组:管道连接起来的,fork出来的进程,共同完成一项工作的进程

pid= -1:调用者进程的任何一个子进程死亡都会回收

pid < -1: 绝对值(| pid |)进程组的任何一个子进程死亡都会回收

options:一般写0

WNOHANG:如果有僵尸,就收,没有,就返回

五、进程终止

正常退出: 

1.main 退出

2.exit(); ()中为 0~255 。 0:正常退出

 exit功能:

  •   执行退出处理程序(退出进程)
  •   清空缓存
  •   _exit(系统函数接口,调用该程序,没有退出处理程序和刷新缓存的功能)

非正常退出:

  • 3.kill 进程pid 让某个进程自己去死

   kill 进程名 是这个名字的进程全部干掉

  • 4 abort();
  • 5. ctrl c

六、进程替换

int execvp( const char *file,char*argv);// 不会创建新进程,会用参数给定的程序替换当前进程。

成功没有返回值;

失败返回-1.

const char*file 用来替换的程序名

七、环境变量:能在当前进程及子进程中使用

  • export 设置新的环境变量
  • echo $环境变量名:显示某个环境变量名
  • env 显示所有的环境变量
  • unset 环境变量名:删除环境变量
  • set :显示本地定义的shell变量和环境变量

 1)

 

2)

3)

 

在上面1),2),3)可以看出:环境变量能在当前进程及子进程中使用,普通变量只有在当前进程中能使用。子进程中定义的环境变量父进程不能使用。

1.获取所有环境变量

2.获取一个环境变量

char* getenv( const char*name)

// 参数是环境变量名

//返回值是环境变量值

在程序中设置环境变量

putenv ( " name = value")

八、进程间关系

 1.进程组:一个或多个进程的集合。(每个进程除了有一个进程ID之外,还有一个进程组)。进程组与同一个作业相关联,可以                    接受来自同一终端的各种信号。每个进程组都有一个唯一的进程组ID.每个进程组都有一个组长进程。组长进标 识:其进程组ID等于其进程ID.进程组长可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中存在一个进程,则该进程组就存在,这与其组长进程是否终止无关

2.作业

作业控制:shell可以运行一个前台作业和任意多个后台作业。

shell分前后台来控制的不是进程而是作业(或是进程组)。

    1)运行在前台,就不能做其他工作。前台作业只有一个。一个前台作业可以由多个进程组成。

    2)运行在后台,就可以做其他工作。因为后台作业可以有一个,也可以有多个。一个后台也可以由多个进程组成。

    3)前后台是针对终端而言的。

作业和进程组的区别:如果作业中的某个进程又创建了子进程,则子进程不属于作业,而属于进程组

3.会话

含义:一个或多个进程组的集合。一个会话可以有一个控制终端(也可以没有)。

一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以,一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组 。

创建会话:

pid_t setsid(void)

     返回值:成功时返回新创建的Session的ID(就是当前进程的ID),出错返回 -1.

    会话ID == 进程首ID(会话首进程是控制进程)

    getcwd :更改运行路径(从哪里运行显示在哪里)

    dev/null/ :设备下的黑洞文件,写进去就没有了

     chdir : 将当前工作目录更改为根目录

4.作业控制

 

几个命令:

        jobs :查看终端里的作业

        fg + 作业号:将“作业号”进程提到前台运行(S+)

        bg + 作业号:将“作业号”进程提到后台运行

       ctrl + z :提到后台 停止(暂停,什么都不干)

       ctrl + c(\) :退出

       “&”:表示将进程组放在后台运行

       PPID : 父进程ID

       PID : 进程ID

       PGID : 进程组ID

       SID : 会话ID

ps选项:

       a :不仅列当前用户的进程,也列出所有其他用户的进程。

       x :不仅列出有控制终端的进程,也列出所有无控制终端的进程。

        j :列出与作业控制相关的信息。

5.守护进程(精灵进程Daemon)

含义:是运行在后台的一种特殊进程。其他进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但是系统服务进程(守护进程)不受用户登录注销的影响,它们一直在运行着。

独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是种很有用的进程。linux的大多数服务器就是用守护进程实现的。比如:ftp服务器,ssh服务器,Web服务器http等。

独立于(脱离)终端的方法:重新创建一个会话。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值