1.什么是程序,什么是进程?
- 计算机程序(Computer Program),港、台译做电脑程式。计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
它以某些程序设计语言编写,运行于某种目标结构体系上。打个比方,程序就如同以英语(程序设计语言)写作的文章,要让一个懂得英语的人(编译器)同时也会阅读这篇文章的人(结构体系)来阅读、理解、标记这篇文章。一般的,以英语文本为基础的计算机程序要经过编译、链接而成为人难以解读,但可轻易被计算机所解读的数字格式,然后放入运行。 - 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
2.如何查看系统中有哪些进程?
- ps -aux 查看所有进程,ps -aux|grep init 查看init进程的具体信息。
- top。如同windows任务管理器
3.什么是进程标识符?
-
每个进程都有一个非负整数表示的唯一ID,叫做 pid,类似身份证。
-
pid=0:称为进程交换,作用是进程调度。
-
pid=1:init进程,作用是系统初始化。
-
getpid 获取函数自己的进程标识符。man getpid 查看具体使用方法。
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
返回值是非负整数。 -
getppid获取父进程的进程标识符。
4.什么是父进程,子进程?
- 如果进程A创建了进程B。那么A叫做父进程,B叫做子进程。
5.C程序的存储空间是如何分配?
该图有个错误,右侧main函数中int a属于栈中的数据,初始化数据段是全局的,并且被初始化的,如int var=10。图中紫色的粗的那个线是错误的,应该把栈和int a 相连接
/**************************************************************************************************************/
/**************************************************************************************************************/
/**************************************************************************************************************/
fork()函数,创建一个进程。
fork函数调用成功,返回两次。
返回值为0,代表当前进程是子进程。返回值为非负数,代表当前进程是父进程。调用失败则返回-1。
vfork函数,也可以创建进程。和fork的区别有
- vfork直接使用父进程存储空间,补考呗。
- vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。
/****************************************************************************************************************/
退出进程:
分为正常退出(5种)和异常退出(3种)。
- 正常退出:main函数调用return。进程调用exit(),标准C库。进程调用_exit()或者_Exit(),属于系统调用。
①父进程为什么要等待子进程退出?
创建子进程的目的是为了让子进程做一些工作,所以要退出子进程并且要检测子进程的退出状态。
子进程退出状态不被收集,变成僵死进程(僵尸进程)。子进程exit函数后,用wait函数收集退出状态,可以防止僵尸进程。
wait函数
pid_t wait(int *status)
status参数是一个整型数指针,非空时子进程退出状态放在它指向的地址中。空(NULL)时,不关心退出状态。
缺点,如果所有子进程还在运行容易阻塞。
waitpid函数
pid_t waitpid(pid_t pid,int *status,int options)
|-------------------------------
孤儿进程
父进程如果不等待子进程退出,在子进程之前就结束了,此时子进程叫做孤儿进程。linux避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。
/***************************************************************************************************************/
exec函数
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);