Linux进程_01

1.程序的开始和结束

1.1程序的开始

  • 在C语言中程序入口是main()函数,操作系统下的应用程序由编译器编译链接生成,在main()执行前需要先执行一段引导代码才能去执行main(),我们写应用程序时不用考虑引导代码的问题,链接器链接时将编译器中事先准备好的引导代码给链接进去和我们的应用程序一起构成最终的可执行程序。
  • 程序运行时则用到加载器。加载器是操作系统中的程序,当执行一个程序时加载器负责将这个程序加载到内存中去执行这个程序。
  • 可以使用argc和argv实现传参。

1.2程序的结束

  • 正常终止:return 0,exit(0),_exit(0)
  • 非正常终止:自己或他人发信号终止进程

atexit()函数可以用来注册进程终止处理函数,即在程序正常终止的时候执行需要的处理函数。

//atexit-register a function to be called at normal process termination
#include <stdlib.h>
int atexit(void (*function)(void));

注意:
atexit()注册多个进程终止处理函数时,先注册的后执行,后注册的先执行。
return、exit和_exit的区别:return和exit终止程序时都会执行atexit注册的进程终止处理函数,而_exit终止进程时不执行atexit注册的进程终止处理函数。

2.进程运行环境

2.1环境变量

在Linux命令行中可以使用export命令查看环境变量

peco@ubuntu:~/linux_pro$ export 
declare -x CLUTTER_IM_MODULE="xim"
declare -x COMPIZ_BIN_PATH="/usr/bin/"
declare -x COMPIZ_CONFIG_PROFILE="ubuntu"
declare -x CONDA_DEFAULT_ENV="base"
declare -x CONDA_EXE="/home/peco/anaconda3/bin/conda"
declare -x CONDA_PREFIX="/home/peco/anaconda3"
declare -x CONDA_PROMPT_MODIFIER=""
...
declare -x PATH="/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin:/home/peco/anaconda3/bin:/home/peco/bin:/home/peco/.local/bin:/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gam
XDG_DATA_DIRS="/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop"
declare -x XDG_GREETER_DATA_DIR="/var/lib/lightdm-data/peco"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SEAT="seat0"
declare -x XDG_SEAT_PATH="/org/freedesktop/DisplayManager/Seat0"
declare -x XDG_SESSION_DESKTOP="ubuntu"
declare -x XDG_SESSION_ID="c2"
declare -x XDG_SESSION_PATH="/org/freedesktop/DisplayManager/Session0"
declare -x XDG_SESSION_TYPE="x11"
declare -x XDG_VTNR="7"
declare -x XMODIFIERS="@im=ibus"

每一个进程中都有一份所有环境变量构成的一个表,也就是说我们当前进程中可以直接使用这些环境变量。进程环境表其实是一个字符串数组,用environ变量指向它。在程序中可以通过environ使用环境变量。
写代码打印环境变量:

#include <stdio.h>
//#include <stdlib.h>
int main(int argc,char**argv)
{
	extern char **environ;		// 声明就能用
	int i = 0;
	
	while (NULL != environ[i])
	{
		printf("%s\n", environ[i]);
		++i;
	}	
	return 0;
}

getenv()函数可以获取指定环境变量,参数name即为环境变量名。

//geten - get an environment variable
#include <stdlib.h>
char *getenv(const char *name);

2.2虚拟地址空间

  • 在Linux系统中,每个进程都运行在属于自己的独立地址空间中。这个独立地址空间就是虚拟地址空间(Virtual Address Space),在32位系统中它是一个4GB的内存地址块。在Linux系统中, OS进程和用户应用程序进程所占的虚拟内存比例是1:3,其中0-1G空间为OS运行空间,1-4G为用户应用程序运行空间。这并不意味着OS和用户应用程序可以使用那么多物理内存,仅表示它可支配这部分地址空间,根据其需要将其映射到物理内存。
  • 虚拟地址通过页表(Page Table)映射到物理内存,页表由操作系统维护并被处理器引用。在Linux中,OS空间是持续存在的,并且在所有进程中都映射到同样的物理内存。OS代码和数据总是可寻址,随时准备处理中断和系统调用。而用户应用程序地址空间的映射随进程切换的发生而不断变化。

虚拟地址空间的意义:

  • 进程隔离。
  • 提供多进程同时运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值