1. 系统程序设计基础
1.1. 进程以及程序的存储结构
Linux的内存分了很多部分,以此来有效管理各种数据,有代码区,数据区,未初始化数据区(bss),堆(动态内存分配),栈(函数参数,返回值,局部变量等)。注意数据段,bss段的变量生存周期是整个进程的运行过程,局部变量生存周期是函数内部。
1.2. 命令行参数
main函数的完整格式是int main(int argc,char *argv[])(有时还有第三个参数表示环境变量)。argc表示参数个数,*argv[]表示各个参数,*argv[0]是函数名,*argv[argc]=null,中间的就是需要输入的参数,以字符串的形式输入。
1.3. 环境变量相关函数
使用命令set,export和env三个命令可以查看详细的环境变量,使用echo+$+环境变量名,可以查看某个环境变量。
增加一个环境变量可以用export+新环境变量名=value,删除就用unset+环境变量名。
1.char getenv(const char var);
函数功能是获取环境变量值。如果要定义一个变量来接受这个函数的返回值,那么一定要定义为字符指针,如char* x,x=getenv(“PATH”),这样X的值才是得到的结果,如果没有就返回NULL.
头文件是<stdlib.h>
2.void unsetenv(cosnt char var);
参数是变量名,即可删除一个环境变量。
头文件是<stdlib.h>
*3.int putenv(const char string);
函数用于修改环境变量,输入的字符串必须是“变量名=变量值”这样一个等式的字符串才可以,如putenv(“AGE=20”);
头文件是<stdlib.h>
**4.int setenv(const char var,const char val,int overwrite);
前两个参数是变量名和变量值,第三个参数是非0覆盖已存在的值,如果该变量本来存在,并且overwrite等于0,那么就对该变量不做修改保持原状,如果本来不存在那就不管它的值直接创建新变量,如果原本存在并且overwrite不等于0,那么就会覆盖之前的变量值,相当于做了修改,如setenv(“AGE”,”20”,1),需要注意的是这样的修改只是在这个程序中有用,需要真正修改环境变量就要在相关的环境变量配置文件中进行修改。
头文件是<stdlib.h>
1.4. 时间管理函数
Linux下的时间设置很复杂,Linux有三种表示方法:time_t(从1970年1月1日午夜开始计数的秒数值,是UTC),结构体时间struct tm,将时间分解为时分秒等等,还有字符串形式(命令date后的结果。)三种形式的时间可以相互转换:
在vim下涉及时间需要使用头文件<time.h>,time_t也是一种数据类型,函数
*1. time_t time(time_t t);
函数作用是得到当前的系统时间,time_t相当于一个long int类型,该函数得到的结果是从开始时间到当前系统时间的秒数。
time_t time1,x;
x= time(&time1);再打印x即是秒数。
头文件是<time.h>
*2. struct tm localtime(const time_t t);
函数功能是把time_t转换为本地时间。定义一个struct tm类型的指针来接收时间,如:
struct tm *time2;
time2=localtime(&time1),注意time2是指针,所以要显示它的成员要使用箭头,如printf(“%d”,time2->tm_year)。
头文件是<time.h>
**3. char ctime(const time_t t);
函数功能是把time_t类型转换为本地时间字符串。定义一个字符串指针来接收如:char *str;
str=ctime(&time1),str可以直接输出。
头文件是<time.h>
1.5. 错误代码errno
程序执行过程中可能会因为各种原因出错,所以可以通过一个全局的整型变量errno来区分究竟发生了什么类型的错误。errno的值为0表示没有错。使用这个变量需要头文件<errno.h>。在程序的过程中都可以打印出errno(int),它的值代表当前的错误类型。
*1.void perror(const char s);
函数功能根据当前errno打印errno对应的错误信息,参数填写自定义的提示信息,返回会打印出错误提示。
头文件是<stdio.h>
2.void exit(int x);
函数是中途退出时的中断函数。比如代码执行到某一步发生了错误那就不应该继续执行,而是中断退出,则写exit(-1),表示代码执行错误时退出。exit(0)表示正常退出。
exit()函数跟return的不同在于exit函数即使是在除main以外的函数中被调用,也会终止进程,如果身处递归,exit函数也将直接退出,而return则会递归到结束
另外exit()在关闭之前还会执行由atexit注册的终止函数,不过是读取到exit函数再倒回去执行注册函数,所以注册函数的实际执行数据,和写代码时的编写顺序是相反的,因为没有读取到exit函数是不会执行这些注册函数的。
头文件是<stdlib.h>