您的位置:首页 > 运维架构 > Linux

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

2013-08-23 13:49 113 查看
众所周知,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_CORE			core文件的最大字节书,0则阻止创建core文件
* RLIMIT_CPU			CPU时间的最大量值,超过此软限制时,向该进程发送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的同义词
* -----------------------------------------------
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: