第8章 进程控制

本文介绍了Linux环境下进程的基础概念,包括进程标识符、进程创建方法及其特点。详细解释了fork、vfork函数的区别,并探讨了exec函数族如何在进程中启动新的程序执行。此外,还概述了进程终止时的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 进程标识
    进程ID为0的一般为调度进程,常常被称为交换进程(swapper)
    #include<unistd.h>
    pid_t getpid(void);  返回值:调用进程的进程ID
    pid_t getppid(void); 返回值:调用进程的父进程ID
    uid_t getuid(void);  返回值:调用进程的实际用户ID
    uid_t geteuid(void); 返回值:调用进程的有效用户ID
    gid_t getgid(void);  返回值:调用进程的实际组ID
    gid_t getegid(void); 返回值:调用进程的有效组ID
  2. 函数fork
    #include<unistd.h>
    pid_t fork(void) 
    返回值:子进程返回0,父进程返回子进程ID;若出错,返回-1
  3. vfork函数
    vfork()会产生一个新的子进程.但是vfork创建的子进程与父进程共享数据段,而且由vfork()创建的
    子进程将先于父进程运行.
    vfork()用法与fork()相似.但是也有区别,具体区别归结为以下3点:
    1. fork():子进程拷贝父进程的数据段,代码段. vfork():子进程与父进程共享数据段.
    2. fork():父子进程的执行次序不确定.
    vfork():保证子进程先运行,在调用exec或_exit之前与父进程数据是共享的,在它调用exec
    或_exit之后父进程才可能被调度运行。
    3. vfork()保证子进程先运行,在她调用exec或_exit之后父进程才可能被调度运行。如果在
    调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
    4.当需要改变共享数据段中变量的值,则拷贝父进程。
  4. 函数exit
    当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。 
  5. 函数wait和waitpid
    #include <sys/types.h> /* 提供类型pid_t的定义 */
    #include <sys/wait.h>
    pid_t wait(int *status)
    进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
  6. 函数exc
    http://blog.youkuaiyun.com/guoping16/article/details/6583383
    fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。
    在Linux中使用exec函数族主要有以下两种情况

    当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用任何exec 函数族让自己重生。
    如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后调用任何一个exec函数使子进程重生
    实际上,在Linux中并没有exec函数,而是有6个以exec开头的函数族,下表列举了exec函数族的6个成员函数的语法。

    所需头文件
    #include <unistd.h>
    函数原型
    int execl(const char *path, const char *arg, ...)
    int execv(const char *path, char *const argv[])
    int execle(const char *path, const char *arg, ..., char *const envp[])
    int execve(const char *path, char *const argv[], char *const envp[])
    int execlp(const char *file, const char *arg, ...)
    int execvp(const char *file, char *const argv[])
    函数返回值
    成功:函数不会返回这6 个函数在函数名和使用语法的规则上都有细微的区别,下面就可执行文件查找方式、参数表传递方式及环境变量这几个方面进行比较说明。
    ①    查找方式:上表其中前4个函数的查找方式都是完整的文件目录路径,而最后2个函数(也就是以p结尾的两个函数)可以只给出文件名,系统就会自动从环境变量“$PATH”所指出的路径中进行查找。
    ②    参数传递方式:exec函数族的参数传递有两种方式,一种是逐个列举的方式,而另一种则是将所有参数整体构造成指针数组进行传递。
    出错:返回-1,失败原因记录在error中
    在这里参数传递方式是以函数名的第5位字母来区分的,字母为“l”(list)的表示逐个列举的方式,字母为“v”(vertor)的表示将所有参数整体构造成指针数组传递,然后将该数组的首地址当做参数传给它,数组中的最后一个指针要求是NULL。读者可以观察execl、execle、execlp的语法与execv、execve、execvp的区别。
    ③    环境变量:exec函数族使用了系统默认的环境变量,也可以传入指定的环境变量。这里以“e”(environment)结尾的两个函数execle、execve就可以在envp[]中指定当前进程所使用的环境变量替换掉该进程继承的所以环境变量。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值