(Linux) 进程控制

一、进程创建

1.fork

①什么是fork?

fork是Linux中非常重要的函数,它是从已经存在的进程(父进程)中创建的一个新的进程(子进程)。

②返回值

子进程返回0。
父进程返回子进程pid。
出错返回-1。
通过fork返回值,决定执行父进程or子进程代码 if-else。

③关系

子进程会继承父进程的pcb。
子进程会拷贝父进程虚拟地址空间,拷贝一份页表。
父子进程共用一份代码(修改时,写时拷贝父进程物理地址空间),拥有两份数据(代码段,数据段相同)。

④调用fork函数

调用fork函数之后,父子进程各自拥有一个独立的执行流,父子进程均会从fork之后的指令开始执行。
内核会分配新的内存块和内存数据结构给子进程,并将父进程部分数据结构内容拷贝给子进程。

⑤先后顺序

fork之后,父子进程两个执行流分别执行。谁先执行不确定,由调度器决定。

⑥用法

父子进程需要执行不同代码段。eg:父进程等待请求,子进程处理请求。
父子进程执行不同程序。eg:子进程从fork返回后,调用exec函数。

⑦失败原因

内存不够。
进程太多。

2.vfork
vfork与fork基本相同
①区别

父子进程共用同一个虚拟地址空间,共用同一份页表。
保证子进程先执行,在子进程调用exec或_exit之后父进程才开始执行。(不能同时执行,父进程先挂起等待)


二、进程终止

1.退出方式
①代码运行完毕,结果正确,返回0
②代码运行完毕,结果错误,返回非0
③代码异常终止,进程收到信号
(PS:查看进程退出码,用 echo $? 指令)
(PPS:$,shell取一个变量的数值;?,变量中内容为上一个进程的退出码)

2.退出方法
①main - return
②rtl + c ,信号终止(异常退出)
③_exit,系统调用

#include <unistd.h>
void _exit(int status);
//参数:定义了进程的终止状态,父进程通过wait来查看
//虽然status是int,但是只有低8位可以被父进程所用。所以_exit(-1)是,在执行*echo $?*查看到的返回值是255.

④exit,库函数,终止进程

#include <unistd.h>
void exit(int status);
//参数:定义了进程的终止状态,父进程通过wait来查看

④_exit,系统调用

#include <unistd.h>
void _exit(int status);
//参数:定义了进程的终止状态,父进程通过wait来查看
//

三、进程等待


四、进程替换


  • 学习进程创建, 等待, 终止. 使用代码实现.
  • 封装fork/wait等操作, 编写函数 process_create(pid_t* pid, void* func, void* arg), func回调函数就是子进程执行的入口函数, arg是传递给func回调函数的参数.
  • 调研popen/system, 理解这两个函数和fork的区别.

·

猜你喜欢

转载自blog.csdn.net/giraffe_255/article/details/80526811