本章将了解进程的环境。

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"

int
main(int argc, char *argv[])
{
int i; for (i = ; i < argc; i++) /* echo all command-line args */
printf("argv[%d]: %s\n", i, argv[i]);
exit();
}

下面是程序运行的情况

环境表

每个程序都接收到一张环境表。与参数表一样,环境表也是一个字符指针数组(以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); //为指定数量指定长度的对象分配存储空间。该空间中的每一位都初始化为0
void *realloc(void *ptr,size_t newsize); //增加或减少以前分配去的长度,新增区域内的初始值不确定。
void free(void *ptr); //释放分配的存储区

环境变量

环境字符串的形式是:name=value

下面函数用于获取跟修改环境变量

#include <stdlib.h>
char *getenv(const char *name); //返回指向与name关联的value的指针;若未找到,返回NULL
int 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,不删除其现有定义,不设置新的value
int 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; int
main(void)
{
int autoval;
register int regival;
volatile int volaval;
static int statval; globval = ; autoval = ; regival = ; volaval = ; statval = ; if (setjmp(jmpbuffer) != ) { //直接调用返回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();
} /*
* Change variables after setjmp, but before longjmp.
*/
globval = ; autoval = ; regival = ; volaval = ;
statval = ; f1(autoval, regival, volaval, statval); /* never returns */
exit();
} static void
f1(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 void
f2(void)
{
longjmp(jmpbuffer, );
}

函数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参数可取下列值之一

RLIMIT_CORE    core文件的最大字节数,若其值为0则阻止创建core文件。
RLIMIT_CPU    CPU时间的最大量值(秒),当超过此软限制时,向该进程发送S I G X C P U信号。
RLIMIT_DATA    一个进程的数据段最大字节长度。数据段中初始化数据、非初始化数据以及堆的总和。当调用函数brk动态改变一个进程的数据段大小时,若失败,errno值将被设置为ENOMEM。
RLIMIT_FSIZE    可以创建的文件的最大字节长度。当超过此软限制时,则向该进程发送SIGXFSZ信号。
RLIMIT_NOFILE    每个进程能打开的最多文件数。
RLIMIT_STACK    栈的最大字节长度。系统不会动态增加栈的大小限制。
RLIMIT_VMEM   可映照地址空间的最大字节长度。
RLIMIT_AS   进程可用内存最大字节数。

apue学习笔记(第七章 进程环境)的更多相关文章

  1. 《UNIX环境高级编程》(APUE) 笔记第七章 - 进程环境

    7 - 进程环境 Github 地址 1. main 函数 C 程序总是从 main 函数 开始执行: int main(int argc, char *argv[]); \(argc\) 为命令行参 ...

  2. apue学习笔记(第九章 进程关系)

    本章将详细地说明进程组以及POSIX.1引入的会话的概念.还将介绍登录shell和所有从登录shell启动的进程之间的关系 终端登录 BSD终端登录.系统管理者创建通常名为/etc/ttys的文件,其 ...

  3. JVM学习笔记-第七章-虚拟机类加载机制

    JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...

  4. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  5. o'Reill的SVG精髓(第二版)学习笔记——第七章

    第七章:路径 所有描述轮廓的数据都放在<path>元素的d属性中(d是data的缩写).路径数据包括单个字符的命令,比如M表示moveto,L表示lineto.接着是该命令的坐标信息. 7 ...

  6. unix高级环境编程学习笔记第七章(未完)

    博客地址:http://www.cnblogs.com/zengjianrong/p/3222081.html 7.1 引言 Main函数调用:命令行参数:存储器布局:如何分配存储器:进程使用env: ...

  7. apue学习笔记(第一章UNIX基础知识)

    总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时 ...

  8. 《metasploit渗透测试魔鬼训练营》学习笔记第七章--社会工程学

    五.社工工程学     5.1社会工程系框架          5.1.1信息搜集                 maltego是一个高度自动化的信息搜集工具,集成在BT5中,如果国内网络环境使用时 ...

  9. apue学习笔记(第八章 进程控制)

    本章介绍UNIX系统的进程控制,包括创建新进程.执行程序和进程终止. 进程标识 每一个进程都有一个非负整数表示的唯一进程ID,除了进程ID,每个进程还有一些其他标识符.下列函数返回这些标识符 #inc ...

随机推荐

  1. AngularJs之HelloWorld

    <!DOCTYPE html> <html lang="en" ng-app> <head> <meta charset="UT ...

  2. 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛

    题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...

  3. SCU 4438 Censor(哈希+模拟栈)

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text \(p\). He ...

  4. springboot 热加载的问题 idea下的springboot热加载的

    最近在学spring框架,使用的是springboot可以省去很多的配置,可谓是初学者的福音啊. 尤其是在刚写代码的时候,都想马上看到自己写出来的效果,看看能不能输出hello world,所以要不断 ...

  5. Linux下常用的命令记录

    本文章记录我在linux系统下常用或有用的系统级命令,包括软硬件查看.修改命令,有CPU.内存.硬盘.网络.系统管理等命令.但本文不打算介绍生僻命令,也不介绍各个linux发行版下的特有命令,且以后会 ...

  6. [NOIP2013] 提高组 洛谷P1979 华容道

    题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...

  7. MVP MVVM MVC

    上一篇得到大家的关注,非常感谢.由于自己对于这些模式的理解也是有限,对于MVC,MVP,MVVM这些模式的比较,是结合自己的理解,一些地方不一定准确,需要的朋友可以参考下 上一篇得到大家的关注,非常感 ...

  8. Codeforces Gym100735 E.Restore (KTU Programming Camp (Day 1) Lithuania, Birˇstonas, August 19, 2015)

    E - Restore Given a matrix A of size N * N. The rows are numbered from 0 to N-1, the columns are num ...

  9. (4)django mtv模式

    mtv模式 http://blog.csdn.net/dbanote/article/details/11338953 models 官方介绍 https://docs.djangoproject.c ...

  10. Light oj 1095 - Arrange the Numbers (组合数学+递推)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1095 题意: 给你包含1~n的排列,初始位置1,2,3...,n,问你刚好固定 ...