Linux系统编程学习之《进程环境》

来源:互联网 发布:温度监测软件 编辑:程序博客网 时间:2024/05/21 10:41

众所周知,C程序的入口是main函数,其标准main函数原型是如下所示的:

int main(int argc,char * argv[]);

argc是命令行参数的数目,argv是参数的指针

已个C进程的终止方式如下,其中5种为正常终止:

1.从main返回

2调用exit

3.调用_exit或_Exit

4.最后一个线程从其启动例程返回

5.最后一个线程调用phread_exit

异常终止有3种方式,分别是:

6.调用abort

7.接收到一个信号并终止

8.最后一个线程对取消请求作出响应


1.exit函数

exit函数用于退出程序,它有多个函数,原型如下:

/* * #include <stdlib.h> * void exit(int status); * void _Exit(int status); * #include <unistd.h> * void _exit(int status); * 三个函数的status都是指终止(退出)程序的返回值 */

2.atexit函数

有时候我们需要能在退出时处理一些工作,就需要调用该函数

/* * #include <stdlib.h> * int atexit(void (*func)(void)); * 成功返回0,出错返回非0 * 该函数用于登记一些调用exit等函数时需要处理的终止函数,ISO-C要求最少可以注册32个 */

3.malloc,calloc和realloc函数

当我们需要动态分配内存时就要用到如下函数:

/* * #include <stdlib.h> * void * malloc(size_t size);  //返回size字节连续存储空间 * void * calloc(size_t nobj,size_t size);  //返回size*nobj字节连续存储空间 * void * realloc(void * ptr,size_t newsize);  //将ptr指向的内存空间调整为newsize大小 * ------------------------------------------ * 三个函数成功返回非空指针,出错返回NULL * ------------------------------------------ * void free(void * prt); //释放ptr指向的动态分配存储空间 */

4.环境变量

环境变量会对我们某些函数有影响,如何设置他们和获取他们,函数如下:

/* * #include <stdlib.h> * char * getenv(const char * name); //成功返回与name关联的value的指针,未找到则返回NULL * int putenv(char * str); //以"name = value"形式吧str字符串放到环境表中 * int setenv(const char * name,const char * value,int rewrite); //将name设置为value;rewrite非0,删除现有定义,为0,不删除现有定义 * int unsetenv(const char * name);  //删除name的定义 */

5.setjmp和longjmp函数

由于goto语句只能在函数内跳转,若要函数之间跳转,则要用setjmp和longjmp

/* * #include <setjmp.h> * int setjmp(jmp_buf env);  //直接调用返回0,从longjmp调用返回非0值 * void longjmp(jmp_buf env,int val); * 在希望返回到的位置调用setjmp设置返回位置,记录在env的jmp_buf结构中 * 在需要返回的地方调用longjmp,第一个参数是跳转到哪个地方,val是从setjmp的返回值 */

6.getrlimit和serlimit函数

每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数查询和更改

/* * #include <sys/resource.h> * int getrlimit(int resource,struct rlimit * rlptr); * int setrlimit(int resource,const struct rlimit * rlptr); * 两个函数成功返回0,出错返回非0 * 其中rlimit结构如下: * struct rlimit{ * rlim_t rlim_cur;  //软限制:当前限制 * rlim_t rlim_max;  //硬限制:当前限制的最大值 * }; * 两个函数的resource可取如下值 * ----------------------------------------------- * RLIM_INFINITY无限制 * RLIMIT_AS进程可用存储区的最大长度(会影响sbrk和mmap函数) * RLIMIT_COREcore文件的最大字节书,0则阻止创建core文件 * RLIMIT_CPUCPU时间的最大量值,超过此软限制时,向该进程发送SIGXCPU信号 * RLIMIT_DATA数据段的最大字节长度 * RLIMIT_FSIZE可以创建的文件的最大字节长度 * RLIMIT_LOCKS一个进程可持有的文件锁的最大数 * RLIMIT_MEMLOCK一个进程使用mlock能够锁定在存储器中的最大字节长度 * RLIMIT_NOFILE每个进程能打开的最大文件数 * RLIMIT_NPROC每个实际用户ID可拥有的最大字进程数 * RLIMIT_RES最大驻内存集的字节长度 * RLIMIT_SBSIZE用户在任意给定时刻可以占用的套接字缓冲区的最大长度(字节) * RLIMIT_STACK栈的最大长度 * RLIMIT_VMEM这是RLIMIT_AS的同义词 * ----------------------------------------------- */