一.linux系统调用及用户编程接口(API)
1. 系统调用
操作系统提供给用户的一组“特殊接口”,用户可以通过该接口获得操作系统内核题供服务。
运行空间分为内核空间和用户空间(内核态和用户态)。分类目的;保护内核空间。它们运行在不同级别上,在逻辑上是相互隔离的。因此用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。
2.用户编程接口(API)
是实现系统调用与程序员进行交互的中间桥梁。
3.系统命令
比API更高一层,内部引用了API来实现相应的功能。
以上几个的关系:
二.linux中文件及文件描述符
“一切皆为文件”,在linux中对目录和设备的操作都等同于对文件的操作。
文件分类:普通文件,目录文件,链接文件,设备文件。
文件描述符是一个非负的整数,它是一个索引值,指向内核中每个进程的记录表中。
1.系统调用创建:
int creat(const char *filename,mode_t mode)
filename:创建的文件名(包含路径,缺省为当前路径)
mode:创建模式
2.常见的创建模式:
S_IRUSR 可读 4
S_IWUSR 可写 2
S_IXUSR 可执行 1
S_IXRWU 可读、可写 、可执行 7
例如:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcnt1.h>
void create__file(char *filename)
{
if(create(filename,0755)<0)
{
printf("create file %s failure!\n",filename);
exit(EXIT_FAILURE);
}
else
{
printf("create file %s success!\n",filename);
}
}
int main(int argc,char *argv[ ])
{
int i;
if(argc<2)
{
printf("you haven't input the filename,please try again!\n");
exit(EXIT_FAILURE);
}
for(i=1;i<argc;i++)
{
create_file(argv[i]);
}
exit(EXIT_SUCCESS);
}
3.系统调用打开
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
返回值:成功返回新分配的文件描述符,出错返回-1并设置errno。
参数含义:pathname是要打开或创建的文件的名字。
flags参数可用来说明此函数的多个选择项。
mode对于open函数而言,仅当创建新文件时使用第三个参数。
4.系统调用读
int read(int fd,const void *buf,size_t length)
从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。
5.系统调用写
int write(int fd ,const void *buf ,size_t length )
把length个字节从buf指向的缓冲区中写到文件描述符所指向的文件中,返回值为
实际写入的字节数。
6.系统调用定位
int lseek(int fd ,offset_t offset ,int whence )
将文件读写指针相对whence移动offset个字节。操作成功时,返回文件 指针相对于文件头的位置。
whence可使用下述值:
SEEK_SET:相对文件开头
SEET_CUR:相对文件读写指针的当前位置
SEET_END:相对文件末尾
offset可去负值,表示向前移动。
例子:lseek(fd,0,SEET_END);这是计算文件长度的函数。
注:库函数的创建、打开、读写,很多地方有相似之处。