apue学习笔记(第七章 进程环境)
来源:互联网 发布:辽宁体育频道直播软件 编辑:程序博客网 时间:2024/05/16 16:06
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 _Exit(int status);#include <unistd.h>void _exit(int status);
3个退出函数都带一个整形参数,称为终止状态。main函数返回一个整形值与用该值调用exit是等价的:exit(0),return(0)。
shell中echo $?可以打印上次运行程序的终止码。
atexit函数
#include <stdlib.h>int atexit(void (*func)(void));
按照ISO C规定,一个进程可以登记多至32个函数,这些函数将由exit自动调用。我们称这些函数为终止处理程序,并调用atexit函数来登记这些函数。
下图显示了一个C程序时如何启动的,以及它终止的各种方式
命令行参数
当执行一个程序时,调用exec的进程可将命令行参数传递给该新程序。下面所示的程序将其所有命令行参数都回显到标准输出上。
#include "apue.h"intmain(int argc, char *argv[]){ int i; for (i = 0; i < argc; i++) /* echo all command-line args */ printf("argv[%d]: %s\n", i, argv[i]); exit(0);}
下面是程序运行的情况
环境表
每个程序都接收到一张环境表。与参数表一样,环境表也是一个字符指针数组(以null结束),全局变量environ则包含了该指针数组的地址:
extern char **environ;
通常使用getenv和putenv函数来访问特定的环境变量。
C程序的存储空间布局
C程序由下列几个部分组成:
1 正文段。这是CPU执行的机器指令部分。
2 初始化数据段。通常称为数据段,它包含了程序中需明确地赋初值的变量。(全局变量)
3 未初始化数据段。通常称为bss段,在程序开始执行之前,内核将此段中的数据初始化为0或空指针。(全局变量)
4 栈。自动变量以及每次函数调用时所需保存的信息存放在此段中。
5 堆。通常在堆中进行动态存储分配。
size命令报告正文段、数据段和bss段的长度(以字节为单位),如:
第4列和第5列分别以十进制和十六进制表示3段总长度。
共享库
共享库使得可执行文件不再需要包含公用的库函数,而只需在所有进程都可饮用的存储区中保存这种库例程的一个副本。
程序第一次执行或第一次调用某个库函数时,用动态链接的方法将程序和共享库函数相链接。
共享库的另一个优点是可以用库函数的新版本代替老版本而无需对使用该库的程序重新链接编辑。
存储空间分配
ISO C说明了3个用于存储空间动态分配的函数。
#include <stdlib.h>void *malloc(size_t size); //分配指定字节数的存储区。此存储区中的初始值不确定。void *calloc(size_t nobj,size_t size); //为指定数量指定长度的对象分配存储空间。该空间中的每一位都初始化为0void *realloc(void *ptr,size_t newsize); //增加或减少以前分配去的长度,新增区域内的初始值不确定。void free(void *ptr); //释放分配的存储区
环境变量
环境字符串的形式是:name=value
下面函数用于获取跟修改环境变量
#include <stdlib.h>char *getenv(const char *name); //返回指向与name关联的value的指针;若未找到,返回NULLint putenv(char *str); //参数为形式为name=value的字符串,如果name已经存在,则先删除其原来的定义int setenv(const char *name,const char *value,int rewrite); //将name设置为value,如果name已经存在:(a)rewrite非0,则首先删除其现有的定义 (b)rewrite为0,不删除其现有定义,不设置新的valueint unsetenv(const char *name); //删除name的定义
函数setjmp和longjmp
setjmp和longjmp函数可以实现函数之间的跳转
#include <setjmp.h>int setjmp(ump_buf env);void longjmp(jmp_buf env,int val); //val将成为setjmp处返回的值
下面演示这两个函数的使用
#include "apue.h"#include <setjmp.h>static void f1(int, int, int, int);static void f2(void);static jmp_buf jmpbuffer;static int globval;intmain(void){ int autoval; register int regival; volatile int volaval; static int statval; globval = 1; autoval = 2; regival = 3; volaval = 4; statval = 5; if (setjmp(jmpbuffer) != 0) { //直接调用返回0,若从longjmp返回则为非0 printf("after longjmp:\n"); printf("globval = %d, autoval = %d, regival = %d," " volaval = %d, statval = %d\n", globval, autoval, regival, volaval, statval); exit(0); } /* * Change variables after setjmp, but before longjmp. */ globval = 95; autoval = 96; regival = 97; volaval = 98; statval = 99; f1(autoval, regival, volaval, statval); /* never returns */ exit(0);}static voidf1(int i, int j, int k, int l){ printf("in f1():\n"); printf("globval = %d, autoval = %d, regival = %d," " volaval = %d, statval = %d\n", globval, i, j, k, l); f2();}static voidf2(void){ longjmp(jmpbuffer, 1);}
函数getrlimt和setrlimit
每个进程都有一组资源限制,其中一些可以用下面两个函数查询和更改。
#include <sys/resource.h>int getrlimit(int resource,struct rlimit *rlptr);int setrlimit(int resource,const struct rlimit *rlptr);struct rlimit { rlim_t rlim_cur; /* Soft limit */ rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */};
这两个函数的resource参数可取下列值之一
- APUE学习笔记:第七章 进程环境
- apue学习笔记(第七章 进程环境)
- old《APUE 2e》学习笔记 第七章 进程环境
- APUE学习笔记——第七章 进程环境
- apue第七章 进程环境 笔记
- 《APUE》笔记-第七章-进程环境
- APUE笔记---第七章 进程环境
- [APUE]第七章 进程环境
- APUE第七章 进程环境
- APUE 第七章 进程环境
- APUE学习笔记5——第七章——进程环境
- APUE第七章学习笔记
- APUE 第七章 进程的运行环境
- APUE读书笔记-第七章 进程环境
- 《APUE》读书笔记—第七章进程环境
- APUE学习笔记——进程环境
- APUE学习:进程环境
- apue学习笔记(第八章 进程控制)
- apue学习笔记(第一章UNIX基础知识)
- apue学习笔记(第三章 文件I/O)
- apue学习笔记(第四章 文件和目录)
- apue学习笔记(第五章 标准I/O)
- apue学习笔记(第六章 系统数据文件和信息)
- apue学习笔记(第七章 进程环境)
- apue学习笔记(第八章 进程控制)
- apue学习笔记(第九章 进程关系)
- apue学习笔记(第十章 信号)
- apue学习笔记(第十一章 线程)
- apue学习笔记(第十二章 线程控制)
- 1055. The World's Richest (25)
- apue学习笔记(第十三章 守护进程)
- apue学习笔记(第十四章 高级I/O)