- 进程相关概念
- 什么是程序,什么是进程,有什么区别?
程序是静态的概念,如 gcc XXX.c -o pro,磁盘中生成pro文件 叫做程序。
进程是程序的一次运行活动,通俗点意思是程序跑起来了,系统中就多了一个进程。
- 如何查看系统中有哪些进程
- 使用ps指令查看
实际工作中,配合grep来查找程序中是否存在某一个进程。
- 使用top指令查看,类似windows任务管理器。
- 什么是进程标识符
每个进程都有一个非负整数表示的唯一ID,叫做pid,类似身份证。
pid=0:称为交换进程(swapper) 作用——进程调度
pid=1:init进程 作用——系统初始化
编程调用getpid函数获取自身的进程标识符,
getppid获取父进程的进程标识符。
- 什么叫父进程,什么叫子进程
进程A创建了进程B,那么A叫做父进程,B叫做子进程,父子进程是相对概念,理解为人类中的父子关系。
- C程序的存储空间是如何分配
- 进程函数fork的使用
1.fork函数
pid_t fork(void);
fork函数调用成功,返回两次
返回值为 0 ,代表当前进程是子进程;
返回值非负数,代表当前进程为父进程。
调用失败,返回-1。
2.vfork函数
两者的区别:
关键区别一:vfork直接使用父进程存储空间,不拷贝。
关键区别二:vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。
- 进程退出
正常退出
- main函数调用return
- 进程调用exit(),标准C库
- 进程调用_exit()或者_Exit(),属于系统调用
补充:
- 进程最后一个线程返回
- 最后一个线程调用pthread_exit
异常退出
- 调用abort
- 当进程收到某些信号时,如ctrl+C
- 最后一个线程对取消(cancellation)请求作出响应
- 父进程等待子进程
wait(int *status)
status参数:是一个整型数指针
非空:子进程退出状态放在他是所指向的地址中
空:不关心退出状态
- exec族函数
- exec族函数的作用
我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另一个程序。当进程盗用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。
- 函数族:execl,execlp,execle,execv,execvp,execvpe
- Exec族函数参数极难记忆和分辨,函数名中的字符会给我们一些帮助:
L:使用参数列表
P:使用文件名,并从path环境进行寻找可执行文件
V:应先构造一个指向参数的指针数组,然后将该数组的地址作为这些函数的参数
E:多了envp[ ]数组,使用新的环境变量代替调用进程的环境变量
- perror 用于查找错误点
- export 修改环境变量
export PATH=$PATH:执行文件的路径
- SYSTEM函数
- system函数的返回值如下:
成功,则返回进程的状态值;当sh不能执行时,返回127;失败返回-1;
- popen函数
popen比system的好处是可以获取运行的输出结构