Linux系统编程与网络编程——进程介绍与进程环境变量(六)

前言

Linux里的进程都是通过拷贝而来的

什么是进程

程序是一个包含可执行指令的文件,而进程是一个开始执行但还没有结束的程序的实例。进程的标准定义是:“进
程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机程
序”。

每个进程启动的时候都会申请一个进程控制块(PCB),里面保存了很多信息,以下只列出了一小部分,如图:
在这里插入图片描述


tast struct简介

为了让linux来管理系统中的进程,每个进程用一个task_struct数据结构来表示。队列task包含指向系统中所有task_struct结构的指针。创建新进程时,Linux将从系统内存中分配一个task_struct结构并将其加入task队列中。系统中还有一个当前进程的指针,用来指向当前运行进程的结构。

task_struct数据结构庞大而复杂,但它可以分成一些功能组成部分:
(1)进程状态
进程在执行过程中会根据环境来改变状态,Linux进程有以下状态: 运行状态、等待状态、停止状态和僵尸状态。

(2)进程调度信息
调度器需要这些信息以便判定系统中哪个进程最迫切需要运行。

(3)标识符
系统中每个进程都有进程标志。进程标志并不是task队列的索引,它仅仅是个数字。每个进程还有一个用户与组标志,它们用来控制进程对系统中文件和设备的存取权限。

(4)进程间通信
Linux支持经典的Unix IPC机制。

(5)进程关系
Linux系统中所有进程都是相互联系的。除了初始化进程外,所有进程都有一个父进程。新进程不是被创建,而是被复制,或者从以前的进程克隆而来。每个进程对应的task_struct结构中包含有指向其父进程和兄弟进程(具有相同父进程的进程)以及子进程的指针。

(6)时间和定时器
核心需要记录进程的创建时间以及在其生命期间消耗的CPU时间。

(7)文件系统
进程可以自由地打开或者关闭文件,进程的task_struct结构中包含一个指向每个打开文件描述符的指针。两个指向VFS索引节点的指针。每个VFS索引节点唯一地表示文件中的一个目录或者文件,同时还对底层文件系统提供了统一的接口。第一个索引节点是进程的根目录,第二个节点是当前的工作目录。两个VFS索引节点都有一个计数字段用来表明指向节点的进程数,当多个进程引用它们时,它的值就增加。

(8)虚拟内存
多数进程都有一些虚拟内存,linux核心必须跟踪虚拟内存与系统物理内存的映射关系。

(9)处理器的内容
进程可以认为是系统当前状态的总和。进程运行时,它将使用处理器的寄存器以及堆栈等等。进程被挂起时,进程的上下文,所有的CPU相关的状态必须保存在它的task_struct结构中。当调度器重新调度该进程时,所有上下文被重新设定。

(10)绑定的终端
进程是否需要控制终端,也记录在task_struct。


进程状态以及状态切换
在这里插入图片描述


进程环境变量

每个进程都有它所运行的的一个环境变量,环境变量一般是存放在内存的用户空间的一个环境变量表中,这个环境变量表是在进程生成时,从父进程的环境变量表中拷贝一份。
在这里插入图片描述
libc中定义的全局变量 char** environ 指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用 extern 声明。例如:

#include <stdio.h>

int main(int argc, char** argv)
{
	extern char** environ;
	int i = 0;
	while(environ[i]!=NULL)
	{
		printf("%s\n", environ[i++]);
	}
	return 0;
}

获取环境变量

使用getenv获取某个环境变量的值。函数原型为:
在这里插入图片描述
函数的参数 name 为环境变量的键值,找到就返回指向value的指针, 否则返回NULL。

设置环境变量

使用setenv来设置某个环境变量的值。函数原型为:
在这里插入图片描述
函数的参数 name 为环境变量的键值, value 为环境变量的值;
参数rewrite为1,则覆盖原来的值;
参数rewrite为0,则不覆盖原来的值 ;

使用unset来清除某个环境变量:
在这里插入图片描述
源码:test_setenv

#include <stdio.h>

int main(int argc, char** argv)
{
	printf("PATH=%s\n", getenv("PATH"));
	setenv("PATH", "/", 1);
	printf("PATH=%s\n", getenv("PATH"));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Gsunshine24/article/details/88958723