linux系统调用及用户编程接口(API):
所谓系统调用是指操作系统提供给用户的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的的服务
在Linux中,为了更好的保护内核空间,将程序的运行空间分为内核空间和用户空间。用户进程通常情况下不允许访问内核数据。
系统调用并不是直接与程序员进行交互的,它仅仅是一个通过软中断机制向内核提交请求,以获取内核服务的接口。在实际使用中程序员调用的通常是用户编程接口—API
系统命令相对API更高了一层,它实际上一个可执行程序,它的内部引用了用户编程接口(API)来实现相应的功能
linux一点哲学:在Linux中对目录和设备的操作等同于对文件的操作;Linux文件可分为:普通文件,目录文件,链接文件,设备文件。
文件描述符:一个非负的整数。
0,1,2已被占有所以只能使用3及其后面的数字作为描述符
系统调用- 创建:
int creat(const char *filename, mode_t mode )
filename :创建的文件名 (包含路径,缺省为当前路径)
mode:创建模式
常创建模式:
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
S_IXRWU 可读、可写、可执行
除用以上宏来选择创建模式,也可以用数字来表示
实例分析:file_creat.c
系统调用-打开:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname,
int flags,mode_t mode);
返回值:成功返回新分配的文件描述符。出错返回-1并设置errno。
pathname是要打开或创建的文件的名字 flags参数可用来说明此函数的多个选择项 mode对于open函数而言,仅当创建新文件时才使用第三个参数
mode参数:
以下可选项可以同时指定0个或多个, 和必选项按位或起来作为flags参数。O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取权限。 O_NONBLOCK 如果p a t h n a m e指的是一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读、写打开
系统调用-关闭:int close(int fd) //fd是文件描述符
系统调用-读:int read(int fd, const void *buf, size_t length)
功能:从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。
系统调用-写:int write(int fd, const void * buf, size_t length)
功能:把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。
系统调用-定位:int lseek(int fd, offset_t offset, int whence)
功能:将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置
whence可使用下述值:
SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾
offset可取负值,表示向前移动。
例如下述调用 可将文件指针相对当前位置向前移动5个字节: lseek(fd, -5, SEEK_CUR)
系统调用-定位:
由于lseek函数的返回值为文件指针相对于文件头的位置,因此下面调用的返回值就是文件的长度: lseek(fd, 0, SEEK_END)
库函数:C库函数的文件操作是独立于具体的操作系统平台的,不管是在DOS、Windows、Linux还是在VxWorks中都是这些函数。
FILE *fopen(const char *filename, const char *mode)
filename:打开的文件名(包含路径,缺省为当前路径)
mode:打开模式
“r” :只读,文件必须已存在
“w”:只写,如果文件不存在则创建,如果文件已存在则把文件长度截断(Truncate)为0字节再重新写,也就是替换掉原来的文件内容
“a”:只能在文件末尾追加数据,如果文件不存在则创建
“r+”:允许读和写,文件必须已存在
“w+”:允讲读和写,如果文件不存在则创建,如果文件已存在则把文件长度截断为0字节再重新写 “a+”:允许读和追加数据,如果文件不存在则创建
库函数-创建和打开:b用于区分二进制文件和文本文件,这一点在DOS、Windows系统中是有区分的,但Linux不区分二进制文件和文本文件
size_t fread(void *ptr, size_t size, size_t n, FILE* stream)
功能从stream指向的文件中读取n个字段,每字段为size字节,并将读取的数据放入ptr所指的字符数组中,返回实际已读取的字段数。
库函数-写:size_t fwrite (const void *ptr, size_t size, size_t n,FILE *stream)
功能:从缓冲区ptr所指的数组中把n个字段写到stream指向的文件中,每个字段长为size个字节,返回实际写入的字段数
库函数-读字符:
库函数-读字符
int fgetc(FILE *stream)
从指定的文件中读一个字符
#include<stdio.h>
main()
{
FILE *fp;
char ch;
if((fp=fopen("c1.txt","rt"))==NULL)
{
printf("\nCannot open file strike any key exit!");
getchar();
exit(1);
}
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
//库函数写
int fputc(int c, FILE *stream)
向指定的文件中写入一个字符
#include<stdio.h>
main()
{
FILE *fp;
char ch;
if((fp=fopen("string","wt+"))==NULL) {
printf("Cannot open file,strike any key exit!");
getch();
exit(1);
}
printf("input a string:\n");
ch=getchar();
while (ch!='\n') {
fputc(ch,fp);
ch=getchar();
}
printf("\n");
fclose(fp);
C语言之文件读写——fscanf(),fprintf()详解:
fscanf()将文件中的读出到标准输入。fprintf()将标准输入写入到文件中。
利用这两个函数可以实现链表通讯录的文件操作。
int save(Hlink head)
{
Hlink p=NULL;
p=head->next;
FILE *savefile;
if (p == NULL)
{
printf("the link is empty!\n");
}
if((savefile=fopen("c1.txt","w"))==NULL)
{
printf("\nCannot open file strike any key exit");
exit(1);
}
while (p!=NULL)
{
//fwrite(p,sizeof(p),3,savefile);
fprintf(savefile,"%s %s %s\n",p->name,p->tel,p->adress);
/*write(savefile,p->name,sizeof(p->name));
write(savefile,p->tel,sizeof(char));
write(savefile,p->adress,sizeof(char));
*/
p=p->next;
}
fclose(savefile);
}
Hlink readfile(Hlink head)
{
Hlink p=NULL;
p=head->next;
FILE *savefile;
if (p == NULL)
{
printf("yhe link is empty!\n");
}
if ((savefile=fopen("c1.txt","r"))==NULL)
{
printf("\ncannot open the file\n");
exit(1);
}
while (p!=NULL)
{
fscanf(savefile,"%s %s %s\n",p->name,p->tel,p->adress);
p=p->next;
}
fclose(savefile);
}