1、main函数
原型:int main(int argc, char *argv[]) 其中argc是命令行参数的数目,argv是指向参数的各个指针构成的数组。
main函数的命令行参数代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){
int i;
for(i = 0 ; i < argc ; i ++)
printf("argv[%d]: %s\n",i,argv[i]);
return 0;
}
执行样例:
./7_1_main main test
argv[0]: ./7_1_main
argv[1]: main
argv[2]: test
2、进程终止
正常终止包括:(1)从main返回,(2)调用exit;(3)调用_exit或者_Exit;(4)最后启动一个线程从其启动例程返回;(5)最后一个线程调用pthread_exit。
异常终止包括:(1)调用abort();(2)接收到一个信号并终止;(3)最后一个线程对取消请求做出响应。
a、exit函数系列:_exit和_Exit函数立即进入内核,而exit函数则执行清理处理(如关闭标准I/O流,执行各终止处理程序)。在main函数执行return (0)与exit(0)是等价的。
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);
个人认为使用exit和return比较好。
b、atexit函数
用来登记终止处理程序,一个进程可以登记多达32个函数,这些函数将有exit自动调用,调用顺序与登记顺序相反,同一个函数可以登记多次,则也会被调用多次。
调用和登记是用栈来存储的,先进后出原则。
#include <stdlib.h>
int atexit(void (*func) (void))
3、环境表
想得到UNIX环境表的方式如下:
extern char **environ;
while(*environ != NULL)
puts(*environ++);
这样和在Linux环境下执行env命令得到的结果是一样的,这里没啥好说的。
4、环境变量
由上述的环境表如果想得到某个参数的具体值可以使用如下函数:
#include <stdlib.h>
char *getenv(const char *name); //指向与name关联的value的指针,若未找到返回NULL
int putenv(char *string); //取形式为name=value的字符串,将其放到环境表中
int setenv(const char *name, const char *value, int rewrite); //将name设置为value,若rewrite为0则不删除现有的定义,rewrite非0则删除其现有的定义
int unsetenv(const char *name); //删除name的定义
int clearenv(void); //删除环境表中所有项
5、存储器分配
即动态内存分配,有三个函数:
a、malloc,分配指定字节的空间(常用)
b、calloc,为指定数量具有指定长度的对象分配存储空间,该空间中每一位初始化为0
c、realloc更改以前分配区的长度
#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);//释放内存空间
6、setjmp和longjmp函数
在C语言中goto语句只能在函数内部跳转,而setjmp和longjmp可以跨越函数。
#include <setjmp.h>
int setjmp(jmp_buf env);//返回值为0为直接调用,从longjmp调用返回为非0值
int longjmp(sigjmp_buf env, int val);
这里的例子建议去看教材。
本章最后还有个资源限制,不知为何物,不说了。