dup2(oldfd, newfd)--> newfd指向oldfd的文件,dup用于复制。
1.了解进程的相关概念
2.掌握fork/getpid/getppid函数使用
3.掌握ps/kill命令使用
4.掌握execl/execlp函数的使用
5.什么是孤儿进程、僵尸进程
6.掌握wait函数使用
7.掌握waitpid函数的使用
1、进程相关概念
程序和进程:程序是指编译好的二进制文件,在磁盘上,不占用系统资源{CPU、内存、打开的文件、设备、锁....};进程,是一个抽象的概念,与操作系统原理联系紧密,进程是活跃的程序,占用系统资源,在内存中执行。(程序运行起来,产生一个进程)
简单来说:进程是运行的程序。从程序员的角度,是运行一系列指令的过程;从操作系统角度,进程是分配系统资源的基本单位。
区别:程序只占用磁盘空间,不占用系统资源;内存占用系统资源。程序没有生命周期,进程有生命周期。
进程状态:就绪、运行、挂起、终止。
进程控制块PCB:每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,linux内核的进程控制块是task_struct结构体。
/usr/src/linux-headers-4.15.0-122/include/linux$ gedit sched.h文件中可以查看该结构体的定义,重点包含:
- 进程id:系统中每个进程有唯一的id,在C语言中pid_t类型表示,其实就是一个非负整数。
- 进程切换时需要保存和恢复的一些cpu寄存器。
- 描述虚拟地址空间的信息。
- 描述控制终端的信息。
- 当前工作目录
- umask掩码
- 文件描述符,包含很多指向file结构体的指针。
- 和信号相关的信息。
- 用户id和组id。
- 会话session和进程组。
- 进程可以使用的资源上限(Resource Limit)
2、环境变量
环境变量是指,在操作系统中用来指定操作系统运行环境的一些参数,通常具备以下特征:
- 字符串(本质)
- 有统一的格式:名=值[:值]
- 值用来描述进程环境信息
存储形式:与命令行参数类似。char *[]数组,数组名environ,内部存储字符串,NULL作为哨兵结尾。
使用形式:与命令行参数类似。
加载位置:与命令行参数类似。位于用户区,高于stack的起始位置。
引入环境变量表:须声明环境变量,extern char ** envrion
---练习:打印当前进程的所有环境变量。
~$ env
PATH: 可执行文件的搜索路径。例如:ls命令也是一个程序,执行它不需要提供完整的路径名/bin/ls,然而,通常我们执行当前目录下的一个程序a.out却需要提供完整的路径名./a.out,这是因为PATH环境变量的值里包含了ls命令所在的目录/bin,却不包含a.out所在的目录。PATH环境变量的值可以多个目录,用 :号隔开,在shell中用echo命令可以查看这个环境变量的值。
~$ echo $PATH
/opt/ros/kinetic/bin:/home/chen/bin:/home/chen/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
SHELL:当前shell,它的值通常是/bin/bash。
3、getenv函数
功能:获取环境变量值。
char *getenv(const char *name); 成功,返回环境变量的值;失败,NULL(name不存在)。
---练习编程实现getenv函数
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("homepath is [%s]\n",getenv("HOME"));
return 0;
}
~$ gcc 01_getenv.c
~$ ./a.out
homepath is [/home/chen]
4、setenv函数
功能:设置环境变量的值。
int setenv(const char *name, const char *value, int overwrite); 成功返回0,失败返回-1.
参数:overwrite取值:1,覆盖原环境变量;0,不覆盖(该参数常用于设置新环境变量,如:ABC = haha-day-night)
5、unsetenv函数
功能:删除环境变量name的定义
int unsetenv(const char *name); 成功,返回0;失败返回-1。
注意事项:name不存在仍返回0(成功),当name命名为"ABC ="时则会出错。