Linux 应用开发之系统调用
系统调用(System Call)是操作系统提供给用户程序调用的一组”特殊”函数接口。Linux 系统分为内核空间和用户空间,用户空间只能通过系统调用接口与内核空间进行通信。 Linux 系统提供了两种方式供用户调用内核中的API来完成各功能,一种是Linux 自身提供的API接口,一种是C标准库接口,进行程序开发时推荐使用后者,后者不依赖于开发平台,可移植性更强。
Linux 提供的系统调用包含以下内容:
进程控制:如 fork、clone、exit 、setpriority 等创建、中止、设置进程优先级的操作。
文件系统控制:如 open、read、write 等对文件的打开、读取、写入操作。
系统控制:如 reboot、stime、init_module 等重启、调整系统时间、初始化模块的系统操作。
内存管理:如 mlock、mremap 等内存页上锁重、映射虚拟内存操作。
网络管理:如 sethostname、gethostname 设置或获取本主机名操作。
socket 控制:如 socket、bind、send 等进行 TCP、UDP 的网络通讯操作。
用户管理:如 setuid、getuid 等设置或获取用户 ID 的操作。
进程间通信:包含信号量、管道、共享内存等操作。
C标准库文件调用接口:
打开文件:
头文件: #include <stdio.h>
函数API:FILE *fopen(const char *pathname, const char *mode);
参数: pathname 指定文件名(绝对路径)
参数:mode 指定打开文件的方式,"r" 只读方式,"r+"读写方式,"w"写方式,会清空源文件内容,"w+"以写方式
打开文件,文件不存在时会创建,"a"以追加方式打开文件,"a+" 以读和追加的方式打开文件。
返回值: 失败返回NULL,成功返回文件指针。
读文件:
头文件:#include <stdio.h>
函数API: size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:ptr 缓存指针。
参数: size 读取数据块大小。
参数:nmemb 读取数据块数量。
参数:stream 读取的文件指针。
返回值 :返回读取的数据长度。
写文件:
头文件:#include <stdio.h>
函数API: size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:ptr 数据缓存指针。
参数:size 写入数据块长度。
参数: nmemb 写入数据块的数量。
参数:stream 文件流指针。
返回值: 返回写入的字节数。
关闭文件:
头文件:#include <unistd.h>
函数API: int close(int fd);
参数: fd 文件描述符
刷新缓冲区:(不用等到缓冲区满,立即写缓冲区的数据到硬盘)
头文件:#include <stdio.h>
函数API:int fflush(FILE *stream);
参数: stream 文件流指针
设置文件指针位置:
头文件:#include <stdio.h>
函数API: int fseek(FILE *stream, long offset, int whence);
参数:stream 文件流指针
参数: offset 文件指针偏移量
参数: whence 文件参考位置,SEEK_SET 代表offset是一个绝对位置, SEEK_END 代表offset以文件尾为参考点,SEEK_CUR 代表 offset 以当前位置为参考位置。
Linux 文件调用接口:
文件打开:
头文件: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
函数API :int open(const char *pathname, int flags);
函数API :int open(const char *pathname, int flags, mode_t mode);(flag == O_CREAT 时使用,指定文件用户权限)
参数: pathname 文件名
参数: flags 文件打开方式 O_RDONLY 以只读方式打开, O_WRONLY 以只写方式打开, O_RDWR 以读写方式打开
O_CREAT 创建新文件 O_APPEND 以追加方式打开,O_TRUNC 文件存在,则清除文件内容。
返回值: 成功返回文件描述符,失败返回 -1.
文件读:
头文件:#include <unistd.h>
函数API :ssize_t read(int fd, void *buf, size_t count);
参数 : fd 文件描述符
参数 : buf 文件缓冲区
参数: count 读取的字节数
返回值:成功返回读到的字节数,失败返回 -1 ,返回0 表示读到文件末尾。
文件写:
头文件: #include <unistd.h>
函数API : ssize_t write(int fd, const void *buf, size_t count);
参数 :fd 文件描述符
参数: buf 文件缓冲区
参数: count 文件写入字节数
返回值:成功返回 写入的字节数,失败返回 -1。
文件关闭:
头文件: #include <unistd.h>
函数API :int close(int fd);
参数: fd 文件描述符
返回值 : 成功返回 0,失败返回-1 .
文件指针设置:
头文件: #include <unistd.h> #include <sys/types.h>
函数API : off_t lseek(int fd, off_t offset, int whence);
参数: fd 文件描述符
参数: offset 文件指针偏移量
参数: whence 修饰offset , SEEK_SET:offset 是一个绝对位,SEEK_END:offset 是以文件尾为参考点的相对位置,
SEEK_CUR:offset 是以当前位置为参考点的相对位置。
Linux 应用开发常用头文件
stdio.h:C 标准输入与输出头文件。
stdlib.h:C 标准库(standard library)头文件,该文件包含了常用的 malloc 函数、free 函数。
sys/stat.h:包含了关于文件权限定义,如 S_IRWXU、S_IWUSR,涉及系统调用文件相关的操作,
通常都需要用到 sys/stat.h 文件。
unistd.h:UNIX C 标准库头文件,unix,linux 系列的操作系统相关的 C 库,包含 read、write 等系统调用的声明。
fcntl.h:unix 标准中通用的头文件,其中包含的相关函数有 open,fcntl,close 等操作。
sys/types.h:包含了 Unix/Linux 系统的数据类型的头文件,常用的有 size_t,time_t,pid_t 等类型。