系统调用之文件访问-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 893600
  • 博文数量: 113
  • 博客积分: 3160
  • 博客等级: 少校
  • 技术积分: 1801
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-19 10:09
文章分类

全部博文(113)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: c/c

2012-06-05 22:08:31

1write系统调用

 

系统调用write的作用是,把缓冲区buf的前nbytes字节写入到与文件描述符fildes关联的文件中,同时它会返回实际写入的字节数。如果返回0,就表示为写出任何数据;如果是-1,就表示在write系统调用中出现了错误,对应的错误码保存在全局变量errno中。

 

 

下面是write系统调用的原型:

 

#include 

size_t write(int fildes, const void *buf, size_t nbytes);

 

(注意:当开始运行程序的时候,它一般会有三个已经打开的文件描述符,其中0代表标准输入,1代表标准输出,2代表标准错误输出。)

 

 

实例:

 

#include 

int main(void)

{

  if ((write(1,"hello world !\n",14)) != 14)

    write(2,"a write error is occoured !\n",28);

  return 0;

}

 

 

测试结果:

 

lishuo@lishuo-rev-1-0:~/test$ make

gcc -o test test.c

lishuo@lishuo-rev-1-0:~/test$ ./test

hello world !

 

 

2read系统调用

 

 

系统调用read的作用是从文件描述符fildes相关联的文件里读入nbytes个字节的数据,把它们放到缓冲区buf中,并返回实际读入的字节书。如果返回0,表示未读入任何数据;如果返回-1,表示read调用出现问题。

 

 

下面是read函数调用原型:

 

#include 

size_t read(int fildes, void *buf, size_t nbytes);

 

 

实例:

 

 

#include 

int main(void)

{

  char buf[128];

  int nread;

  nread = read(0, buf, 128);

  if((write(1,buf,nread)) != nread)

    write(2,"a error occured !",17);

  return 0;

}

 

 

测试结果:

 

lishuo@lishuo-rev-1-0:~/test$ make

gcc -o test test.c

lishuo@lishuo-rev-1-0:~/test$ ./test

hello world !

hello world !

 

 

3open系统调用

 

 

open系统调用创建了一条到文件或设备的访问路径,如果操作成功,它将返回一个文件描述符,readwrite等系统调用就是使用该文件描述符对打开的文件进行操作。open调用成功时返回一个新的文件描述符,失败时返回-1.并设置errno指明失败的原因。

 

 

函数原型如下:

 

#include 

int open(const char* pathname, int oflag);

int open(const char* pathname, int oflag, mode_t mode);

 

 

pathname为文件名,如“file.c”;

 

oflag表示open以什么方式打开该文件,其中o_rdonly(只读)o_wronly(只写)o_rdwr(读写)为三种最常用的方式。其中如果设置了o_creat,open就会按照mode给出的访问模式创建文件。

 

mode为访问权限的初始值,这些标志在sys/stat.h中定义。例如open("myfile", o_creat, s_irusr | s_iwusr | s_ixuur),它的作用是创建一个myfile新文件,只有文件所有者具有读写和执行的权限。

 

 

实例:

 

 

#include 

#include 

#include 

int main(void)

{

  char buf;

  int in, out;

  // 以只读方式打开文件file.in,同时返回文件描述符

  in = open("file.in", o_rdonly);

  // 以只写方式打开文件file.out,同时返回文件描述符

  out = open("file.out", o_wronly);

  // file.in的每个字节都写入到file.out

  while(read(in, &buf, 1) == 1)

    write(out, &buf, 1);

  return 0;

}

 

 

测试结果:

 

 

1:编译

lishuo@lishuo-rev-1-0:~/test$ make

gcc -o test test.c

 

 

2:创建文件file.infile.out

lishuo@lishuo-rev-1-0:~/test$ man rm > file.in

lishuo@lishuo-rev-1-0:~/test$ > file.out

lishuo@lishuo-rev-1-0:~/test$ls -l file.in file.out

-rw-rw-r-- 1 lishuo lishuo 3949  6月  5 19:10 file.in

-rw-rw-r-- 1 lishuo lishuo    0  6月  5 19:11 file.out

 

 

3:执行

lishuo@lishuo-rev-1-0:~/test$ ./test

lishuo@lishuo-rev-1-0:~/test$ ls -l file.in file.out

-rw-rw-r-- 1 lishuo lishuo 3949  6月  5 19:10 file.in

-rw-rw-r-- 1 lishuo lishuo 3949  6月  5 19:11 file.out

lishuo@lishuo-rev-1-0:~/test$ diff file.in file.out

 

 

 

4close系统调用

 

 

close系统调用终止一个文件描述符fildes与其对应文件之间的关联,文件描述符被释放并能够重新使用。当返回0的时候,说明close调用成功,-1表示调用出错。

 

 

函数原型:

 

#include 

int close(int fildes);

 

 

 

5:ioctl系统调用

 

ioctl提供了一个用于控制设备及其描述符行为和配置底层服务的接口。

 

 

函数原型:

 

#include 

int ioctl(int fildes, int cmd, ...);

 

 

6:lseek系统调用

 

 

lseek系统调用对文件描述符fildes的读写指针进行设置,读写指针可以设置为文件中的某个绝对位置,也可以为相对位置。它返回从文件头到文件指针被设置出的字节偏移值,失败返回-1

 

 

函数原型:

 

#include 

#include 

off_t lseek(int fildes, off_t offset, int whence);

 

fildes:文件描述符

 

offset:指定偏移位置

 

whence:可取下列值:seek_set(绝对位置),seek_cur(相对与当前位置的一个相对位置),seek_end(相对与文件尾的一个相对位置。)

 

off_t:定义在sys/stat.h中。

 

 

7fstat系统调用

 

fstat系统调用返回与打开文件描述符相关的文件爱你的状态信息,该信息将会写到buf结构中,buf的地址以参数形式传递给fstat

 

stat系统调用通过文件名返回状态信息;如果是一个符号链接的时候,lstat返回的是该符号链接本身的信息,而stat返回该链接指向文件的信息。

 

 

函数原型:

 

#include 

#include 

#include 

int fstat(int fildes, struct stat *buf);

int stat(const char* path, struct stat *buf);

int lstat(const char* path, struct stat *buf);

 

 

8dupdup2系统调用

 

 

dup系统调用复制文件描述符fildes,返回一个新的描述符;

 

dup2系统调用通过明确指定目标描述符把一个文件描述符复制成另外一个。

 

 

函数原型:

 

 

#include 

int dup(int fildes);

int dup2(int fildes, int fildes2);

阅读(2287) | 评论(0) | 转发(0) |
0

上一篇:每天两个命令之ln与rm(8)

下一篇:链接

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图