Linux下的进程、(v)fork函数、wait函数、exec函数

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[]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值