系统调用(函数)和库函数
系统调用和OS有关,直接运行在内核空间(权限大、速度快,效率低),面向硬件(可移植性差),不带缓冲;
库函数和OS无关,面向应用开发;它对系统调用进行了封装,库函数的优势:第一:双缓冲技术的实现。第二,可移植性。第三,弥补了底层调用本身的一些性能方面的缺陷。库函数调用运行在用户空间(受到权限的约束)
数学函数
数学函数头文件为math.h,在使用gcc编译时必须添加:-lm 选项。
幂运算: double pow(double x, double y)
开方运算: double sqrt(double x)
随机数: int rand() 产生一个 0~2147483647之间的一个数
设置随机种子: void srand(unsigned int seed)
时间
Unix/Linux以秒为单位记录时间,数据类型为time_t [_t是整数的意思]
time_t time(time_t *t) 系统调用,返回自1970.1.1午夜以来流失的秒数。
struct tm * gmtime(const time_t *timep) 转换为格林尼治时间
struct tm * localtime(const time_t * timep) 将时间转换为当地更人性化的时间。
localtime_r(const time_t * timep, *tm) //线程安全
char * asctime(const struct tm *tp) 和 char * ctime(const time_t * t) 都是将指定时间转换为字符形式的时间,长度大概26个字母。
time_t mktime(struct tm *tp):将结构体时间转换为流失的秒数。
获取高精度时间: int gettimeofday(struct timeval *tv, struct timezone *tz):将当前系统时间填充到tv中,tz已经被废弃,一般指定为NULL。返回0表示成功,-1表示失败。
头文件:sys/time.h
环境控制函数
char * getenv(char *name):获得名称为name的环境变量的值。
int putenv(char *str):添加变量或修改变量值,str格式:name=value
extern char **environ:所有环境变量 //写在外部
env是一个获取所有环境变量的命令
内存分配
void *malloc(size_t size):分配一个大小为size的内存块,不做初始化,返回一个无类型指针。 void *calloc(size_t nmemb, size_t size):分配size个大小为nmemb的内存块,返回的是一个无类型指针数组。
free(void *ptr):释放ptr指向的内存。//不释放容易内存泄漏
内存映射
void *mmap(void *start, size_t len, int port, int flags, int fd, off_t offset)
系统调用,将指定文件内容映射到内存中,对该区块内存的存取即对该文件的存取。//不会丢失
头文件:sys/mman.h start: 内存起始地址,一般设为NULL len:分配内存大小
fd:文件描述符
offsize:映射文件内容的起始位置,设为0表示映射整个文件
flags:指定映射类型。
MAP_SHARED:共享内存,对内存的修改其它进程可见,同时反映到文件;
MAP_PRIVATE:修改其它进程不可见,且不反映到文件。
Map_SHARED和MAP_PRIVATE必须二选一。MAP_FIXED:若指定了start,且使用start无法创建成功,则放弃映射;不推荐使用。
解除映射—munmap
int munmap(void *addr, size_t len) addr:待解除内存起始地址 len:大小