第7章 进程环境

  • main函数

main函数之前会有一个特殊的启动程序,启动例程从内核取得命令行参数和环境变量。

  • 进程终止

正常终止:

  1. 从main函数返回
  2. 调用exit
  3. 调用_exit或_Exit
  4. 最后一个线程从启动例程返回
  5. 最后一个线程调用pthread_exit

异常终止:

  1. 调用abort
  2. 接到一个信号终止
  3. 最后一个线程对取消请求作出相应

exit函数

_exit和_Exit直接进入内核,exit则先执行一系列清理处理(调用终止处理程序,关闭所有标准io流),然后进入内核

#include<stdlib.h>

void exit(int status);

void _Exit(int status);

#include<unistd.h>

void _exit(int status);

status 终止状态

atexit函数

登记函数

#include<stdlib.h>

int atexit(void (*func)(void));

exit调用这些函数的顺序与它们登记的顺序相反,登记多次也将执行多次

  • 命令行参数

调用exec的进程可将命令行参数传递给该新程序。

  • 环境表

extern char **environ;

  • C程序的存储空间布局

正文段:cpu执行的机器指令部分。可共享

初始化数据段:明确的赋初值的变量。

非初始化数据段:bss段,任何程序外的C声明

栈:自动变量以及每次函数调用时需要保存的信息

堆:动态存储的分配

size命令报告报告正文段/数据段/bss段

  • 共享库

动态链接

  • 存储器分配

#include<stdlib.h>

void *malloc(size_t size);

void *calloc(size_t nobj,size_t size);

void *realloc(void *ptr,size_t newsize);

void free(void *ptr);

  • 环境变量

#include<stdlib.h>

char *getenv(const char *name);

应使用geienv函数获取指点环境变量的值,而不是直接使用environ。

设置环境变量时只会影响当前进程及调用的子进程的环境,但不影响父进程的环境。

#include <stdlib.h>

int putenv(char *str);

int setenv(const char* name,const char *value,int rewrite);

int unsetenv(const char *name);

putenv将字符串直接放到环境表中,如果是自动变量会出现错误,

setenv分配存储区

  1. 修改现有的name

    • 如果新的value比原来的短或者相等,可以直接放到原来的存储区
    • 如果长,就需要malloc新的存储区
  2. 增加新的name
    • 如果是第一次,则需要分配新的环境表存储区,然后分配新的字符串存储区
    • 如果不是第一次了,就realloc环境表的存储区,然后直接分配新的字符串存储区就可以了。
  • setjmp和longjmp函数

goto是不能跨越函数的,只能在函数内部蹦达

#include<setjmp.h>

int setjmp(jmp_buf env);

void longjmp(jmp_buf env,int val);

首先,用setjmp定位要跳到什么地方,setjmp返回的是longjmp第二个参数指定的数值,可以用来指定跳转意图。

env一般声明为全局变量,存储调用longjmp时能用来恢复栈状态的所有信息。

  • getrlinmit和setrlimit函数
时间: 2024-07-29 16:46:49

第7章 进程环境的相关文章

《Unix环境高级编程》读书笔记 第7章-进程环境

1. main函数 int main( int argc, char *argv[] ); argc是命令行参数的数目,包括程序名在内 argv是指向参数的各个指针所构成的数组,即指针数组 当内核执行C程序时(使用exec函数),在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址——这是由连接器设置的,而连接器则是由C编译器调用.启动例程从内核取得命令行参数和环境变量值,然后按上述方式调用main函数做好安排. 2. 进程终止 有8种方式使进程终止,其中5种

APUE学习笔记:第七章 进程环境

7.1 引言 本章将学习:当执行程序时,其main函数是如何被调用的:命令行参数是如何传送给执行程序的:典型的存储器布局是什么样式:如何分配另外的存储空间:进程如何使用环境变量:各种不同的进程终止方式等:另外还将说明longjmp和setjmp函数以及它们与栈的交互作用:还将介绍研究进程的资源限制 7.2 main函数 C程序总是从main函数开始执行.当内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编辑器设置的,而连接编

Unix编程第7章 进程环境

准备雄心勃勃的看完APUE,但是总感觉看着看着就像进入一本字典,很多地方都是介绍函数的用法的,但是给出例子远不及函数介绍的多.而且这本书还是个大部头呢.第7章的讲的进程环境,进程是程序设计中一个比较重要的概念,知道倒是知道它的大概意思,但是其实还是有很多的细节其实都没有深究,这章呢APUE就带着我们逛了一下如下的几个主题(尼玛,学C语言的话,学那点语法其实不是很重要,反而经常把时间浪费在语法的蹩脚处): 1.程序执行的时候main函数是如何被调用的 2.命令行参数是如何传递给新程序的: 3.典型

APUE学习笔记(第七章 进程环境)

本章将了解进程的环境. main函数 C程序总是从main函数开始执行,main函数的原型是: int main(int argc,char *argv[]); 其中,argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组. 进程终止 3个函数用于正常终止一个程序:_exit和_Exit立即进入内核,exit则先执行一些清理处理(对于所有打开流调用fclose函数),然后返回内核. #include <stdlib.h> void exit(int status); void _

第5章 进程环境(3)_环境表和环境变量

3. 环境表 (1)每个进程都有一个独立的环境表(字符指针数组) (2)初始的环境表继承自父进程 (3)两种访问方式: ①int main(int argc, char* argv[], char* envp[]);  //第3个参数 ②extern char** environ;   //全局变量 4. 环境变量操作函数 (1)getenv:获取环境变量值 头文件 #include<stdlib.h> 函数 char* getenv(const char* name); 返回值 指向与nam

第5章 进程环境(2)_进程的启动和终止

2. 进程启动和终止 2.1 C程序启动过程 (1)启动例程 ①是一段程序代码,放置在/lib/libc.so.***中.编译器在编译时会将启动例程的代码编译进可执行文件中. ②可执行程序将这段嵌入的启动例代码指代为程序的起始地址. ③当内核执行C程序时(使用exec函数),在调用main前先执行启动例程代码. (2)启动例程的作用 ①搜集命令行的参数传递给main函数中的argc和argv ②搜集环境信息构建环境表并传递给main函数 ③登记进程的终止函数 2.2 进程终止   进程终止 主要

《第7章 进程环境》

1.进程终止 从main返回: 调用exit: 调用_exit或_Exit: 最后一个线程从其启动例程返回: 从最后一个线程调用ptherad_exit: 以上五种位正常终止. 调用abort: 接到一个信号: 最后一个线程对取消请求作出响应: 以上三种为异常终止. 其中_exit和_Exit立即进入内核,exit则会先执行一些清理处理,然后返回内核. #include <stdlib.h> void exit(int status); void _Exit(int status); #inc

第5章 进程环境(4)_进程资源限制

5. 进程资源限制 (1)getrlimit.setrlimit函数 头文件 #include<sys/resource.h> 函数 int* getrlimit(int resource, struct rlimit* rlptr); 返回值 成功返回0,出错返回非0 功能 获得资源限制,存放在rlptr指向的结构体中 参数 (1)rlimit结构体 struct rlimit{ rlim_t rlim_cur; //软限制:当前限制 rlim_t rlim_max; //硬限制:rlim_

第5章 进程环境(5)_非局部跳转

6. 非局部跳转 (1)setjmp和longjmp语句 头文件 #include<setjmp.h> 函数 int* setjmp(jum_buf env); 返回值 直接调用返回0,若从longjmp调用返回则返回非0值 功能 设置非局部跳转的跳转点   函数 void longjmp(jmp_buf env, int val); 功能 进行非局部转转,val为返回值 参数 env:一个特殊类型jmp_buf.这一数据类型是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的信