当前位置:文档之家› linux文件IO操作

linux文件IO操作

linux文件IO操作
linux文件IO操作

不带缓存的文件I/O 操作,主要用到5 个函数:open、read、write、lseek和close。这里的不带缓存是指每一个函数都只调用系统中的一个函数(不理解这句话的含义)。这些函数虽然不是ANSI C的组成部分,但是是POSIX 的组成部分。

open函数语法要点

|-- #i nclude // 提供类型pid_t的定义

所需头文件----|-- #i nclude

|-- #i nclude

函数原型int open(const char *pathname,flags,int perms)

pathname 被打开的文件名(可包括路径名)

O_RDONLY:只读方式打开文件

O_WRONLY:可写方式打开文件

O_RDWR:读写方式打开文件

O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三个参数为其设置权限

O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一

函数传入值参数可测试文件是否存在

O_NOCTTY:使用本参数时,如文件为终端

终端不可用open()系统调用的那个进程的控制终端

O_TRUNC:如文件已经存在,并且以只读或只写成功打开,那么会先

全部删除文件中原有数据

O+APPEND:以添加方式打开文件,在打开文件的同时,文件指针指

向文件的末尾

perms 被打开文件的存取权限,为8进制表示法

函数返回值成功:返回文件描述符

失败:-1

补述:文件描述符

对于Linux 而言,所有对设备和文件的操作都使用文件描述符来进行的。文件描述符

是一个非负的整数,它是一个索引值,并指向内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。

通常,一个进程启动时,都会打开3 个文件:标准输入、标准输出和标准出错处理。这3 个文件分别对应文件描述符为0、1 和2(也就是宏替换STDIN_FILENO、STDOUT_FI LENO

和STDERR_FILENO)。

基于文件描述符的I/O 操作虽然不能移植到类Linux 以外的系统上去(如Windows),但它

往往是实现某些I/O操作的惟一途径,如Linux中低级文件操作函数、多路I/O、TCP/IP套接字

编程接口等。同时,它们也很好地兼容POSIX标准,因此,可以很方便地移植到任何POS IX平

台上。基于文件描述符的I/O操作是Linux中最常用的操作之一。

read函数语法要点

所需头文件#i nclude

函数原型ssize_t read(int fd,void *buf,size_t count)

fd:文件描述符

函数传入值buf:指定存储器读出数据的缓函数传入值冲区

count:指定读出的字节数

成功:读到的字节数

函数返回值0:已到达文件尾

-1:出错

write函数语法要点

所需头文件#i nclude

函数原型ssize_t write(int fd,void *buf,size_t count)

fd:文件描述符

函数传入值buf:指定存储器写入数据的缓函数传入值冲区

count:指定读出的字节数

函数返回值成功:已写的字节数

-1:出错

lseek函数语法要点

所需头文件#i nclude

#i nclude

函数原型off_t lseek(int fd,off_t offset,int whence)

fd:文件描述符

函数传入值offset:偏移量,每一读写操作所需要移动的距离

单位是字节的数量,可正可负(向前移,向后移)

whence:SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小

当前位置SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移

的基点SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移

函数返回值成功:文件的当前位移

-1:出错

/*打开,关闭,读写文件.c*/

#i nclude unistd.h>

#i nclude sys/types.h>

#i nclude sys/stat.h>

#i nclude fcntl.h>

#i nclude stdlib.h>

#i nclude stdio.h>

int main(void)

{

int fd; //文件描述符

int i,size,len;

char *buf="Writing to this file!";

char buf_r[10];

len = strlen(buf);

/*调用open函数,以可读写的方式打开,注意选项可以用“|”符号连接*/

if((fd = open("/tmp/hello.c", O_CREAT | O_TRUNC | O_WRONLY , 0600 ))0){

perror("open:");

exit(1);

}

else{

printf("Open file: hello.c %d\n",fd);

}

/*调用write函数,将buf中的内容写入到打开的文件中*/

if((size = write( fd, buf, len)) 0){

perror("write:");

exit(1);

}

else

printf("Write:%s\n",buf);

/*调用lsseek函数将文件指针移到文件起始,并读出文件中的10个字节*/ lseek( fd, 0, SEEK_SET );

if((size = read( fd, buf_r, 10))0){

perror("read:");

exit(1);

}

else

printf("read form file:%s\n",buf_r);

if( close(fd) 0 ){

perror("close:");

exit(1);

}

else

printf("Close hello.c\n");

exit(0);

}

当多个用户共同使用、操作一个文件的情况,这时,Linux 通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。

文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。在Lin ux 中,实现文件上锁的函数有lock和fcntl,其中flock用于对文件施加建议性锁,而fcntl 不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对文件的某一记录进行

上锁,也就是记录锁。记录锁又可分为读取锁和写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在

文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何时刻只能有一个进程在文件的某个部分上建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。

fcntl函数格式

fcntl函数可以改变已经打开文件的性质。

#i nclude

#i nclude

#i nclude

int fcntl(int filedes, int cmd, ... ) ;

返回:若成功则依赖于cmd(见下),若出错为- 1。

f c n t l函数有五种功能:

n 复制一个现存的描述符, 新文件描述符作为函数值返(c m d=F_DUPFD)。

n 获得/设置文件描述符标记,对应于filedes 的文件描述符标志作为函数值返回.(c m d = F_GETFD或F_SETFD)。

n 获得/设置文件状态标志,对应于filedes 的文件状态标志作为函数值返回。(c m d = F_GETFL或F_SETFL)。

n 获得/设置异步I / O有权(c m d = F_GETOWN或F_SETOWN)。

n 获得/设置记录锁(c m d = F_SETLK , F_SETLKW)。

关于加锁和解锁区域的说明还要注意下列各点:

l 该区域可以在当前文件尾端处开始或越过其尾端处开始,但是不能在文件起始位置之前开始或越过该起始位置。

l 如若l_len为0,则表示锁的区域从其起点(由l_start和l_whence决定)开始直至最大可能位置为止。也就是不管添写到该文件中多少数据,它都处于锁的范围。

l 为了锁整个文件,通常的方法是将l_start说明为0,l_whence说明为SEEK_SET,l_len说明为0。

实例:

/*fcntl_write.c测试文件写入锁主函数部分*/

#i nclude unistd.h>

#i nclude sys/file.h>

#i nclude sys/types.h>

#i nclude sys/stat.h>

#i nclude stdio.h>

#i nclude stdlib.h>

/*lock_set函数*/

void lock_set(int fd, int type)

{

struct flock lock;

lock.l_whence = SEEK_SET;//赋值lock结构体

lock.l_start = 0;

lock.l_len =0;

while(1)

{

lock.l_type = type;

/*根据不同的type值给文件上锁或解锁*/

if((fcntl(fd, F_SETLK, &lock)) == 0)

{

if( lock.l_type == F_RDLCK )

printf("read lock set by %d\n",getpid());

else if( lock.l_type == F_WRLCK )

printf("write lock set by %d\n",getpid());

else if( lock.l_type == F_UNLCK )

printf("release lock by %d\n",getpid());

return;

}

/*判断文件是否可以上锁*/

fcntl(fd, F_GETLK,&lock);

/*判断文件不能上锁的原因*/

if(lock.l_type != F_UNLCK)

{

/*/该文件已有写入锁*/

if( lock.l_type == F_RDLCK )

printf("read lock already set by %d\n",lock.l_pid);

/*该文件已有读取锁*/

else if( lock.l_type == F_WRLCK )

printf("write lock already set by %d\n",lock.l_pid);

getchar();

}

}

}

int main(void)

{

int fd;

/*首先打开文件*/

fd=open("hello",O_RDWR | O_CREAT, 0666);

if(fd 0)

{

perror("open");

exit(1);

}

/*给文件上写入锁*/

lock_set(fd, F_WRLCK);

getchar();

/*给文件接锁*/

lock_set(fd, F_UNLCK);

getchar();

close(fd);

exit(0);

}

开两个终端分别运行,可看到先运行的那个终端,成功上锁,后运行的那个无效。可见写入锁是互斥锁,一个时候只能有一个写入锁存在

select 实现I/O复用

I/O处理的五种模型

①阻塞I/O模型:若所调用的I/O函数没有完成相关的功能就会使进程挂起,直到相关数据到达才会返回。如:终端、网络设备的访问。

②非阻塞模型:当请求的I/O操作不能完成时,则不让进程休眠,而且返回一个错误。如:open、read、write访问。

③I/O多路转接模型:如果请求的I/O 操作阻塞,且他不是真正阻塞I/O,而且让其中的一个函数等待,在这期间,I/O还能进行其他操作。如:select函数。

④信号驱动I/O模型:在这种模型下,通过安装一个信号处理程序,系统可以自动捕获特定信号的到来,从而启动I/O。

⑤异步I/O模型:在这种模型下,当一个描述符已准备好,可以启动I/O时,进程会通知内核。由内核进行后续处理,这种用法现在较少。

select函数

传向select的参数告诉内核:

(1) 我们所关心的描述符。

(2) 对于每个描述符我们所关心的条件(是否读一个给定的描述符?是否想写一个给定的描述符?是否关心一个描述符的异常条件?)。

(3) 希望等待多长时间(可以永远等待,等待一个固定量时间,或完全不等待)。

从s e l e c t返回时,内核告诉我们:

(1) 已准备好的描述符的数量。

(2) 哪一个描述符已准备好读、写或异常条件。

#i nclude /* fd_set data type */

#i nclude /* struct timeval */

#i nclude /* function prototype might be here */

int select (int numfds, fd_set *readfds,

fd_set *writefds, fd_set *exceptfds, struct timeval * timeout) ;

返回:准备就绪的描述符数,若超时则为0,若出错则为- 1。

timeout值:

n NULL:永远等待,直到捕捉到信号或文件描述符已准备好为止;

n 具体值:struct timeval 类型的指针,若等待为timeout时间还没有文件描述符准备好,就立即返回;

n 0:从不等待,测试所有指定的描述符并立即返回;

先说明最后一个参数,它指定愿意等待的时间。

struct timeval

{

long tv_sec; /* seconds */

long tv_usec; /* and microseconds */

};

select函数根据希望进行的文件操作对文件描述符进行分类处理,这里,对文件描述符的处理主要设计4个宏函数:

FD_ZERO(fd_set *set) 清除一个文件描述符集;

FD_SET(int fd, fd_set *set) 将一个文件描述符加入文件描述符集中;

FD_CLR(int fd, fd_set *set) 将一个文件描述符从文件描述符集中清除;

FD_ISSET(int fd, fd_set *set) 测试该集中的一个给定位是否有变化;

在使用select函数之前,首先使用FD_ZERO和FD_SET来初始化文件描述符集,并使用s elect函数时,可循环使用FD_ISSET测试描述符集,在执行完成对相关的文件描述符后,使用FD_CLR来清除描述符集。

实例

/*select.c*/

#i nclude fcntl.h>

#i nclude stdio.h>

#i nclude unistd.h>

#i nclude stdlib.h>

#i nclude sys/time.h>

int main(void)

{

int fds[2];

char buf[7];

int i,rc,maxfd;

fd_set inset1,inset2;

struct timeval tv;

if((fds[0] = open ("hello1", O_RDWR|O_CREAT,0666))0)

perror("open hello1");

if((fds[1] = open ("hello2", O_RDWR|O_CREAT,0666))0)

perror("open hello2");

if((rc = write(fds[0],"Hello!\n",7)))

printf("rc=%d\n",rc);

lseek(fds[0],0,SEEK_SET);

maxfd = fds[0]>fds[1] ? fds[0] : fds[1];

//初始化读集合inset1,并在读集合中加入相应的描述集

FD_ZERO(&inset1);

FD_SET(fds[0],&inset1);

//初始化写集合inset2,并在写集合中加入相应的描述集

FD_ZERO(&inset2);

FD_SET(fds[1],&inset2);

https://www.doczj.com/doc/a74682763.html,_sec=2;

https://www.doczj.com/doc/a74682763.html,_usec=0;

// 循环测试该文件描述符是否准备就绪,并调用select 函数对相关文件描述符做相应操作

while(FD_ISSET(fds[0],&inset1)||FD_ISSET(fds[1],&inset2))

{

if(select(maxfd+1,&inset1,&inset2,NULL,&tv)0)

perror("select");

else{

if(FD_ISSET(fds[0],&inset1))

{

rc = read(fds[0],buf,7);

if(rc>0)

{

buf[rc]='\0';

printf("read: %s\n",buf);

}else

perror("read");

}

if(FD_ISSET(fds[1],&inset2))

{

rc = write(fds[1],buf,7);

if(rc>0)

{

buf[rc]='\0';

printf("rc=%d,write: %s\n",rc,buf);

}else

perror("write");

sleep(10);

}

}

}

exit(0);

}

实验 Linux文件和目录操作

实验Linux文件和目录操作(1) 一、实验内容 练习Linux文件和目录操作命令。 二、实验目的 掌握文件与目录管理命令 掌握文件内容查阅命令 三、实验题目 1. 文件与目录管理 (1) 查看CentOS根目录下有哪些内容? (2) 进入/tmp目录,以自己的学号建一个目录,并进入该目录。 (3) 显示目前所在的目录。 (4) 在当前目录下,建立权限为741的目录test1,查看是否创建成功。 (5) 在目录test1下建立目录test2/teat3/test4。 (6) 进入test2,删除目录test3/test4。 (7) 将root用户家目录下的.bashrc复制到/tmp下,并更名为bashrc (8) 重复步骤6,要求在覆盖前询问是否覆盖。 (9) 复制目录/etc/下的内容到/tmp下。 (10) 在当前目录下建立文件aaa。 (11)查看该文件的权限、大小及时间 (12) 强制删除该文件。 (13) 将/tmp下的bashrc移到/tmp/test1/test2中。 (14) 将/test1目录及其下面包含的所有文件删除。 2. 文件内容查阅、权限与文件查找 (1) 使用cat命令加行号显示文件/etc/issue的内容。 (2) 反向显示/etc/issue中的内容。 (3) 用nl列出/etc/issue中的内容。 (4) 使用more命令查看文件/etc/man.config (5) 使用less命令前后翻看文件/etc/man.config中的内容 (6) 使用head命令查看文件/etc/man.config前20行 (7) 使用less命令查看文件/etc/man.config后5行 (8) 查看文件/etc/man.config前20行中后5行的内容 (9) 将/usr/bin/passwd中的内容使用ASCII方式输出 (10) 进入/tmp目录,将/root/.bashrc复制成bashrc,复制完全的属性,检查其日期 (11) 修改文件bashrc的时间为当前时间

1_Linux C 文件与IO操作

Linux 文件与I/O操作 Andrew Huang 课程内容 l系统调用 l底层库函数 l标准库函数 l目录与文件维护 系统调用 l Linux 大部分的系统功能是通过系统调用(System Call)来实现的.如open,send之类. l这些函数在C程序调用起来跟标准C库函数(printf…)非常类似.但是实现机制完全不同. l库函数仍然是运行在Linux 用户空间程序.很多时候内部会调用系统调用. l但系统调用是内核实现的.在C库封装成函数.但通过系统软中断进行调用. –用time命令测试时间,系统时间实际就是系统调用时间累积 l time ./demo1 –用strace 可以跟踪一种程序系统调用使用情况 l strace ./demo1 #不需要调试信息 两者关系 l可以参考C库函数malloc与系统调用sbrk的关系

常见C标准库函数 l printf,getch,scanf l strcpy,strcmp,strlen l memcpy,memcmp,memset l fopen,fwrite,fread 常见系统调用函数 l进程控制:fork(),waitpid() l文件控制open(),write() l网络收发函数socket(),bind(),send(),write() l权限控制 access() l标准C的函数,应该在MSDN和Linux下的man都能同时查找联机帮助 –并且声明定义在stdlib.h当中 l而Linux系统调用只能用man查找相应帮助 –大部分声明定义在unistd.h当中 文件控制 1. Linux文件结构 l Linux环境中的文件具有特别重要的意义,因为它们为操作系统服务和设备提供了一个简单而统一的接口.在Linux中,一切(或几乎一切)都是文件。 l通常程序完全可以像使用文件那样使用磁盘文件、串行口、打印机和其他设备。 l大多数情况下,你只需要使用五个基本的函数——open、close、read、write和ioctl l Linux中的任何事物都可以用一个文件代表,或者可以通过特殊的文件进行操作。 l一些特殊文件 –目录 –设备文件 –/dev/console –/dev/tty –/dev/null 2. 底层库函数 l Linux 在底层实现一整套处理文件函数. –这一些函数能处理普通文件,网络socket文件,设备文件等 –全部是系统调用实现的函数 l文件处理函数 –open –打开或创建一个文件 –creat –建立一个空文件 –close –关闭一个文件 –read –从文件读入数据 –write –向文件写入一个数据 –lseek –在文件中移动读写位置

linux高级编程(文件操作)

文件及设备操作 1.基本概念 linux下文件操作的两种方法:原始文件I/O、标准I/O库 标准I/O库: 是C语言的标准输入输出库,是针对流对象FILE 进行的操作,是带缓存的。 原始I/O库:是linux系统提供的文件API,是针对描述描进行的操作,是无缓存机制。 文件描述符:创建一个新文件或打开现有文件时,内核向进程返回的一个非负整数。 其范围在0~OPENMAX之间,OPENMAX是一个宏,不同linux版本取值不同. 系统调用:是操作系统提供的某些功能的接口(函数) 常用设备 /dev/null 空设备,丢弃数据用 /dev/port 存取I/O端口 /dev/ttyN N(0 1 ...) 字符终端 /dev/sdaN N(0 1...) SCSI磁盘 /dev/scdN N(0 1...) SCSI光驱 /dev/mouseN N(0 1...) 鼠标 /dev/socksys 套接字访问端口接口,用于网络传输 /dev/route 路由器控制设备 /dev/fbN N(0 1...) 帧缓冲设备(frame buffer) 重点 /dev/mixer 混音器音量控制、混音控制重点 /dev/dsp 声卡数字采样和数字录音设备用于播放声音和录音经常使用重点(oss) /dev/audio 声卡音频设备用于播放声音和录音,支持sun音频较少使用 /dev/video 视频摄像头用于视频采样(录像) 常用头文件 #include 对外提供的各种数据类型如size_t #include 对外提供的各种结构类型如time_t #include 对外提供的各种错误号的定义用数字代码的错误类型 #include 文件控制的函数定义 #include 串口的结构及定义 #include 声卡的结构及定义 #include 设备控制函数 #include 在C++内加入的头 2.设备的操作函数 #include #include #include #include #include 1)Access

实验11-Linux文件操作(II)

实验11 Linux基本文件操作(II) 实验目的 熟悉与目录和文件操作相关的命令 实验内容与要求 要求 显示当前目录的目录名 改变当前目录 使用ls命令的不同命令选项,来查看文件与目录的属性 创建和删除目录 创建0长度的文件 拷贝、移动、重命名、链接及删除文件 查看文件的内容 内容 一、检查你现在所处的环境 1.登录进入系统:使用pwd命令,确认你现在正处在自己的主目录中。这个目 录就是在你登录时,用户缺省进入的目录。 思考:设置默认主目录的环境变量是PATH 二、查看目录 1.把你的当前目录改变为根目录。 2.确认你的当前目录是根目录,并且使用简单列表命令和长列表命令来列出本 目录中的文件。调用使用-a或-R命令选项的ls命令。每一个命令选项各有什么作用?回到你的用户主目录,并列出所有的文件(包括隐藏文件)3.在你的用户主目录中创建一个名为mydir的新目录。然后调用长列表命令来 查看/home/xxx/mydir目录和/home/xxx目录(只查看目录文件的信息)。注意这里xxx代表的是当前用户名。

4.把目录/home/xxx/mydir变为自己的当前目录。使用touch命令在mydir目录 创建名为myfile1,myfile2的两个文件。 5.使用长列表命令来查看mydir目录中的文件的信息。myfile1与myfile2的文 件大小是多少?再次使用长列表命令,同时列出索引结点(inode)的信息。这两个文件的索引结点号是什么? 6.返回到你的用户主目录,调用ls –R命令来查看你的用户主目录中的目录树 结构。 7.使用rmdir命令删除mydir目录,这个命令工作了吗?请注意rmdir命令不能 删除一个非空的目录。为了删除这个目录,你需要调用命令rm –r。 三、对文件进行操作 1.查看/etc/inittab和/etc/passwd文件的内容。使用命令cat、view、less、more 来分别查看每一个命令的输出方式(提示:/etc/inittab文件包括了系统登录的相关信息,/etc/passwd文件包括了被授权使用该系统的用户的列表)。比较cat、view、less、more这几个命令的异同。 2.拷贝文件/usr/bin/cat到你的用户主目录中。该目录没有cat文件,用find命 令查找 3.拷贝文件/usr/bin/cal到你的用户主目录中。 4.列出你的用户主目录中的文件,你会发现上面两个文件已经被拷贝过来了。 在你的用户主目录中创建一个名为xxxscript的目录 四、对目录进行操作 1.将上面两个文件(cat, cal)移动到xxxscript目录中,并且重新命名为mycat 和mycal; 2.将xxxscript目录变为你的当前目录。列出当前目录中的各个文件名,确认上 述两个文件已经被拷贝过来并已更名。 3.使用mycat命令来显示你的用户主目录中的文件.bash_profile中的内容。返 回到你的用户主目录中。 4.在你的用户主目录中创建另一个子目录goodstuff,拷贝文件/etc/profile到这

Linux操作题整理

五、实验题(共5题,每题2分,共10分) 写出下列操作命令: 1、查看/etc/boot路径下的所有内容。 Ls –al /etc/boot/* 2、查看文件/etc/hosts的内容。 Cat /etc/hosts 3、增加一个组账号group1,并指定组账号ID分别为10100。Groupadd –g 10100 group1 4、增加一个用户账号user1(UID为2045,并属于组group1)。Useradd –u 2045 –g group1 user1 5、搜索路径/etc下所有以h开头的文件及目录,拷贝到/software 中。 Cp –r /etc/h* /software 1.按顺序写出下面操作步骤中所用到的命令。

1) 创建新目录my目录 2) 进入my目录 3) 把一个文本文件复制到my目录下同时命名为,该文本文件绝对路径为/user/book/ 4) 把/user/book/移动到my目录下,文件名不变 5) 删除目录my,没有任何提示 答: 1) $mkdir my 2) $cd my 3) $cp /user/book/ 4) $mv /user/book/ 5) $rm -rf my 下安装软件方式有两种:一是安装rpm格式的智能软件包,二是下载源码编译安装,要求安装以下两个软件:和安装,写出所用到的命令 2) 安装,写出解压解包以及标准安装方式所需步骤和命令。

答:(教材82、84、87页) 1) rpm -ivh 参数含义:i表示安装,v表示在安装过程中显示详细的安装信息,h表示显示水平进度条。 2) 源码编译安装方式: ①释放TAR包 使用命令如下:tar zxvf 查看并阅读包内附带的软件安装说明 ③进行编译准备 使用命令如下:./configure ④进行编译 执行make命令 ⑤进行软件安装 执行make install命令 ⑥清楚临时文件 执行make clean命令

Linux系统编程-文件操作

最基本的访问文件方法是:使用read()和write()系统调用。在一个文件能被访问之前,必须通过open() 或者creat()系统调用打开它,一旦使用完毕,则用close()系统调用来关闭文件。 1.open #include #include #include int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 返回值:成功返回新分配的文件描述符,出错返回-1并设置errno eg: int fd; fd = open("/home/kidd/aaa",O_RDONLY); if(fd == -1) /*error*/ pathname 参数是要打开或创建的文件名,和fopen一样,pathname 既可以是相对路径也可以是绝对路径。 flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来, 所以这些常数的宏定义都以O_开头,表示or 。 以下三个三先一: O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 可读可写打开 以下可多选(以或的形式)(进行按位或运算,用以修改打开文件请求的行为) O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容。 (文件将以追加模式下打开。就是说,在每次写操作之前,文件位置指针将被置于文件末尾,即使 在进程刚刚完成写操作并改变文件位置指针之后,如有另一进程开始写操作,情形也是如此。)O_CREAT 若此文件不存在则由(内核来)创建它。使用此选项时需要提供第三个参数mode,表示该文件的访问权限。 有0666。如果文件已存在,本标志无效,除非给出了O_EXCL标志。 当文件创建时,mode参数提供新建文件的权限。系统并不在该次打开文件时检查权限,所以你可以进行相反的操作,例如设置文件为只读权限,但却在打开文件后进行写操作。最终写入磁盘的权限位还需让mode参数与用户文件创建的掩码(即umask)做按位与操作后来确定。 umask 022,mode 0666,文件权限为0644(0666&~022) O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回。(用来防止文件创建时出现单键竞争。)O_TRUNC 如果文件已存在且为普通文件,并且以只写或可读可写方式打开,则将其长度截断(Truncate)为0字节。 对于FIFO或者终端设备,该参数被忽略。在其他文件类型上则没有定义。因为截断文件需要写权限,所以O_TRUNC和O_RDONLY同时使用也是没有定义的。 eg: int fd; fd = open("/home/teach/pearl", O_WRONLY|O_TRUNC); if(fd == -1) /*error*/ O_NONBLOCK 对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O (Nonblock I/O )。

实验8 Linux文件操作

linux文件操作篇 open(打开文件) 表头文件 #include #include #include 定义函数int open( const char * pathname, int flags); int open( const char * pathname,int flags, mode_t mode); 函数说明参数pathname 指向欲打开的文件路径字符串。下列是参数flags 所能使用的旗标: O_RDONLY 以只读方式打开文件 O_WRONLY 以只写方式打开文件 O_RDWR 以可读写方式打开文件。上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。 O_CREAT若欲打开的文件不存在则自动建立该文件。 O_EXCL 如果O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。 O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。 O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。 O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。 O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。 O_NDELAY 同O_NONBLOCK。 O_SYNC 以同步的方式打开文件。 O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。 O_DIRECTORY 如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。 此为Linux2.2以后特有的旗标,以避免一些系统安全问题。参数mode 则有下列数种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。 S_IRWXU00700 权限,代表该文件所有者具有可读、可写及可执行的权限。

Linux目录和文件操作命令练习题

实验一:目录和文件操作命令 一、 root身份登录redhat,在/test目录下创建如下子树

二、完成以下操作: 1、将/test目录设置为所有人可读、可写、可执行;

2、新建用户user1,user2,user3,user4,并分别设置密码; 3、新建组workg1,workg2;

4、将user1、user2归属到workg1组中,将user3、user4归属到workg2组中; 5、查看四个用户信息(利用/etc/passwd文件); 6、打开tty1,user1登录,在/test/owner/music下新建一文件:mymusic01.mp3,并将文件权限设置为除了本人,其他人都不能读、写、执行;

7、接上题,继续在/test/public/pubfile下新建一文件:user1file.txt,并将权限设置为所有人可读,可写,不可执行; 8、继续在/test/team/tefile下新建一文件:monday.txt,并将权限设置为自己、组员可读可写,其他人不可读不可写,所有人不可执行; 9、打开tty2,以user2身份登录,查看/test目录信息;

10、接上题,查看/test/owner/music/mynusic01.mp3,显示命令执行结果; 11、接上题,查看/test/public/pubfile/user1file.txt,显示命令执行结果; 12、接上题,查看/test/team/tefile/monday.txt, 显示命令执行结果; 13、打开tty3,以user3身份登录; 14、接上题,查看/test/owner/music/mynusic01.mp3,显示命令执

linux系统调用和文件操作

零、本课程能学到的内容 1、文件系统及文件的IO操作。 2、linux的多进程编程。 3、linux的多线程编程。 4、进程及线程之间的同步和异步通信 5、linux的网络编程(编写服务器、客户端、TCP、UDP程序)。 一、linux的系统调用 用户程序通过软中断的方式,让cpu切换到内核态运行,数据就借此传输。 对于CPU来说,它不知道现在运行是用户程序还是内核程序。软中断后,cpu根据拿到的数据,进行特定的任务,然后退出中断,将任务的结果交回给用户程序。 这个任务如何描述?是通过数字来编号的。 例子:写一个打印字符串的程序,通过系统调用来完成。 需要传递的参数有:指向字符串的指针(字符串的首地址),字符串的长度。 汇编写法 用int$0x80产生软中断 C的写法 直接使用syscall函数(它的本质就是用软中断来产生系统调用) 系统调用编号见:/usr/include/asm/unistd_32.h里 一共有358个。其中,4号对应的write调用。 二、linux文件系统基础 扇区(sector):磁头读取的最小单位数据,在磁盘上类似一个扇子的形状。一般是512个字节。 块(block):软件读取磁盘的最小单位数据,一般来说是扇区的2的n次幂大小,常用的有4096个字节。 块就是文件存放的最小单位。如果有一个文件是15045个字节,那么就分成4个块存储,最后那个块的数据是不满的。 可以用数组的方式将一个文件的所有数据块的编号保存起来。

这个数组多大合适? 前提是数组大小要固定,才好管理。 用一个15元素的数组来保存数据块的编号。 其中0-11元素,保存数据块的前面12个,第12个元素是一个一级指针,指向另一个表格,那个表格是4096字节,可以保存1024个块的编号。 如果还不够,第13个元素是一个二级指针,指向的那个表格是一级指针表格。14个元素是三级指针,指向的表格是二级指针表格。 全部用完可以存储2G大小的文件的数据块编号。 在文件系统内部,如何来表示一个文件呢? 用一个inode结构体来表示一个文件。inode是index node的意思。也叫索引节点。一个索引节点对应一个文件,有多少个文件就有多少个索引节点。 inode结构体里面有文件的大小、文件的修改时间、文件的权限、文件的数据块的编号数组。 inode结构体数组保存了所有文件的inode,这个数组的下标就是inode编号。文件名或者目录名保存目录文件的数据块里面。在linux里面,一个目录也是一个文件,叫做目录文件,其它的叫做普通文件。目录文件里就有,inode编号和文件名的对应关系。 那么,给出文件路径时,如何找到这个文件的数据块? /usr/include/stdio.h 首先,找到根目录的数据块,从里面找到文件和inode编号关系表, 例如usr这个文件名和inode编号为10002是对应的,那么就到inode结构体数组里找出下标为10002的元素,得到对应文件usr的数据块,因为usr也是一个文件夹,既然是文件夹,它的数据块里面也会有关系表,就可以找到include这个文件的数据块,最后找到stdio.h的数据块,这个是一个普通文件,就把它的数据块全部取出来。 这里搜索的起点是根目录的数据块,那么这个文件的数据块到哪里找? 在一个磁盘里面,最开始的几个块,存储了本磁盘的很多重要数据,例如块的大小,有哪些inode下标空闲,哪些已经用了,最重要的是根目录的数据块。 所有的参数存放在其中的一个块,这个块叫做超级块(super block)。在磁盘格式化,实际就是生成一个超级块。这个块的重要性毋庸置疑,如果数据被损坏,则磁盘没办法使用。 三、打开文件 在linux里面,用open函数就可以打开一个文件。 函数原型:int open(const char*path,int flag) 函数如果打开成功,则返回一个文件描述符f ile d escribtor,这个描述符fd是一个非负整数。 1、文件描述符

linux文件读写浅析

linux文件读写浅析 2009-10-30 23:12 在《linux内核虚拟文件系统浅析》这篇文章中,我们看到文件是如何被打开、文件的读写是如何被触发的。 对一个已打开的文件fd进行read/write系统调用时,内核中该文件所对应的file结构的f_op->read/f_op->write被调用。 本文将顺着这条路走下去,大致看看普通磁盘文件的读写是怎样实现的。 linux内核响应一个块设备文件读写的层次结构如图(摘自ULK3): 1、VFS,虚拟文件系统。 之前我们已经看到f_op->read/f_op->write如何被调用,这就是VFS干的事(参见:《linux内核虚拟文件系统浅析》); 2、Disk Caches,磁盘高速缓存。 将磁盘上的数据缓存在内存中,加速文件的读写。实际上,在一般情况下,read/write是只跟缓存打交道的。(当然,存在特殊情况。下面会说到。)read就直接从缓存读数据。如果要读的数据还不在缓存中,则触发一次读盘操作,然后等待磁盘上的数据被更新到磁盘高速缓存中;write也是直接写到缓存里去,然后就不用管了。后续内核会负责将数据写回磁盘。

为了实现这样的缓存,每个文件的inode内嵌了一个address_space结构,通过inode->i_mapping来访问。address_space结构中维护了一棵radix树,用于磁盘高速缓存的内存页面就挂在这棵树上。而既然磁盘高速缓存是跟文件的inode 关联上的,则打开这个文件的每个进程都共用同一份缓存。 radix树的具体实现细节这里可以不用关心,可以把它理解成一个数组。数组中的每个元素就是一个页面,文件的内容就顺序存放在这些页面中。 于是,通过要读写的文件pos,可以换算得到要读写的是第几页(pos是以字节为单位,只需要除以每个页的字节数即可)。 inode被载入内存的时候,对应的磁盘高速缓存是空的(radix树上没有页面)。随着文件的读写,磁盘上的数据被载入内存,相应的内存页被挂到radix树的相应位置上。 如果文件被写,则仅仅是对应inode的radix树上的对应页上的内容被更新,并不会直接写回磁盘。这样被写过,但还没有更新到磁盘的页称为脏页。 内核线程pdflush定期将每个inode上的脏页更新到磁盘,也会适时地将radix 上的页面回收,这些内容都不在这里深入探讨了。 当需要读写的文件内容尚未载入到对应的radix树时,read/write的执行过程会向底层的“通用块层”发起读请求,以便将数据读入。 而如果文件打开时指定了O_DIRECT选项,则表示绕开磁盘高速缓存,直接与“通用块层”打交道。 既然磁盘高速缓存提供了有利于提高读写效率的缓存机制,为什么又要使用 O_DIRECT选项来绕开它呢?一般情况下,这样做的应用程序会自己在用户态维护一套更利于应用程序使用的专用的缓存机制,用以取代内核提供的磁盘高速缓存这种通用的缓存机制。(数据库程序通常就会这么干。) 既然使用O_DIRECT选项后,文件的缓存从内核提供的磁盘高速缓存变成了用户态的缓存,那么打开同一文件的不同进程将无法共享这些缓存(除非这些进程再创建一个共享内存什么的)。而如果对于同一个文件,某些进程使用了O_DIRECT 选项,而某些又没有呢?没有使用O_DIRECT选项的进程读写这个文件时,会在磁盘高速缓存中留下相应的内容;而使用了O_DIRECT选项的进程读写这个文件时,需要先将磁盘高速缓存里面对应本次读写的脏数据写回磁盘,然后再对磁盘进行直接读写。 关于O_DIRECT选项带来的direct_IO的具体实现细节,说来话长,在这里就不做介绍了。 3、Generic Block Layer,通用块层。 linux内核为块设备抽象了统一的模型,把块设备看作是由若干个扇区组成的数组空间。扇区是磁盘设备读写的最小单位,通过扇区号可以指定要访问的磁盘扇区。 上层的读写请求在通用块层被构造成一个或多个bio结构,这个结构里面描述了一次请求--访问的起始扇区号?访问多少个扇区?是读还是写?相应的内存页有哪些、页偏移和数据长度是多少?等等…… 这里面主要有两个问题:要访问的扇区号从哪里来?内存是怎么组织的?

Linux常用文件系统操作命令

常用文件系统操作命令 一、Linux命令操作基础 1.文件通配符 Linux的命令中可以使用通配符来同时引用多个文件以方便操作。可以使用的通配符主要有“*”和“?”两种,结合使用“[]”、“-”和“!”字符可以扩充需要匹配的文件范围。(1)通配符“*” 通配符“*”代表任意长度(包括零个)的任何字符。但通配符“*”不能与“.”开头的文件名匹配。 (2)通配符“?” 通配符“?”代表任何单个字符。 (3)字符组通配符“[]”、“-”和“!” 用一对方括号“[]”括起来的字符串列表表示匹配字符串列表中的任意一个字符。其中的字符串列表可以由直接给出的若干个字符组成,也可以由起始字符、连接符“-”和终止字符组成。 例:myfile[abc] 表示myfile后面紧跟着a、b或c。 myfile[a-z] 表示myfile后面紧跟着一个小写字母。 Myfile[!a-e]表示myfile后面紧跟这一个不在a-e之间的字符。 Myfile[*?] 方括号中的星号和问号代表一个字符,不是通配符。 2.自动补全 所谓自动补全,是指用户在输入命令或文件名时不需要输入完整的名字,只需要输入前面几个字母,系统会自动补全该命令或文件名。若有不止一个,则显示出所有与输入字母相匹配的命令或文件名,以供用户选择。利用【tab】键可实现自动补全功能。 (1)自动补全命令 用户在输入Linux的命令时,只需要输入命令名的前几个字母,然后按【tab】键,如果系统只找到一个与输入相匹配的命令名,则自动补全;如果没有匹配的内容或有多个相匹配的名字,系统将发出警鸣声,再按【tab】键将列出所有相匹配的命令。 (2)自动补全文件或目录名 除了可以自动补全命令名外,还可以用相同的方法自动补全命令行中的文件或目录名。 3.命令历史 Linux系统中的灭个用户在自己的主目录下都有一个名为.bash_history的隐藏文件,它用来保存曾执行过的命令,这样当用户下次需要再次执行已执行过的命令时,不用再次输入,而可以直接调用。Bash默认最多保存1000个命令的历史记录。 调用历史命令的方法: (1)上下方向键 在命令行方式下按上方向键,命令提示符后将出现最近一次执行过的命令,再使用上下方向键,可以在已执行过的各条命令之间进行切换。直接按【enter】键就可以再次执行显示的命令,也可以对显示的命令行进行编辑修改。 (2)history和“!”命令 运用history命令可以查看命令的历史记录。 格式:history [数字] 如果不使用数字参数,则将查看所有命令的历史记录;如果使用数字参数,则将查看最近执行过指定个数的命令。显示的每条命令前面均有一个编号,反映其在历史记录列表中的序号。可以用“!”命令再次调用已执行过的历史记录,其格式为:

Linux实验二(文件操作命令)

Linux操作系统实验2. 文件操作命令 李玉鹏 07030314 2010.9.20

打开应用程序中的终端,准备进行文件命令操作。如图1-1 图1-1 进入终端 图1-2所示的信息,是对ls命令的列出指定目录中的文件和目录。ls-a是全部显示,ls-l显示详细信息,ls-S为按文件大小排序。 图1-2 ls的相关操作

如图1-3所示的图形是mkdir创建目录,使用-p可按层次一次性连续创建多个目录test1/test2/test。 图1-3 mkdir连续创建目录 如图1-4所示的信息,对1-3中创建的连续目录test1/test2/test进行删除操作,使用rmdir –p /test1/test2/test。 图1-4 rmdir删除连续目录

如图1-5所示的信息,使用rm命令进行删除,rm –r test1是删除test1目录中的所有目录和文件,rm –f /test.txt 是对test.txt文件进行强制删除。 图1-5 rm删除命令 如图1-6所示的信息,touch –a命令只修改访问时间,-m只更改修改时间。 图1-6 修改文件访问和修改时间

进入如图1-7所示的内容,已完成访问和修改时间。 图1-7 分区提示 如图1-8所示信息,使用rename命令修改名字,rename test1.txt text1.txt *test.txt, rename 原名改名*原名。 图1-8 rename文件改名

如图1-9所示信息,mv 文件文件夹,将文件test.txt移至文件夹11 图1-9 将文件移入文件夹 如图1-10所示信息,使用cp -r命令将目录复制入目录,再使用ls进行查看。 图1-10 复制目录

第二章 Linux 文件操作

第二章 Linux 文件操作(4学时) 实验一文件属性和无缓冲I/O 实验目的 1.熟悉Linux文件系统属性控制 2.掌握不带缓存的文件I/O程序设计方法 实验内容 1.修改文件权限:用touch 新建一文件file,查看文件权限。 (1)命令提示符下 chmod 将文件权限改为:同组用户可读可写,其他用户可写权限,所有者权限不变。 (2)编程修改文件权限为所有者具有读写权限,其他用户只有读权限。 2.设计一程序通过设置文件权限掩码,使得新建文件newfile具有所有者读写,其他只读 权限,并调用ls命令查看文件。 3.设计一程序,要求判断文件“/etc/passwd”最后一次修改时间。 4.设计一程序,要求打开文件“pass”,如果没有这个文件,新建文件,权限设置为所有 者读写权限,利用write函数将键盘输入字符串写入文件,并查看该文件。 5.设计一程序,使用read函数从源文件读取数据,再用write函数写入到目标文件,源 文件名和目标文件名都由键盘输入。 实验指导 一、存取权限 文件存取权限定义文件访问方式(mode_t取值) 在对文件执行相应操作前,有必要读取该文件的属性,文件的属性一般由struct stat 数据结构的成员变量保存。Linux 读取文件属性的函数stat 声明如下: #include #include #include

int stat(const char *file_name, struct stat *buf); 第一个参数为欲读取状态的文件,可以使用绝对路径或相对路径; 第二个参数为读取的文件状态存放的临时数据结构buf。 struct stat 数据结构定义如下: come from /usr/include/asm/stat.h struct stat { unsigned short st_dev; //设备号 unsigned short __pad1; unsigned long st_ino; //节点 unsigned short st_mode; //模式 unsigned short st_nlink; //连接 unsigned short st_uid; //用户ID unsigned short st_gid; //组ID unsigned short st_rdev; //设备类型 unsigned short __pad2; unsigned long st_size; // unsigned long st_blksize; //块大小 unsigned long st_blocks; //块数量 unsigned long st_atime; //最后一次访问时间 unsigned long __unused1; unsigned long st_mtime; //最后一次修改时间 unsigned long __unused2; unsigned long st_ctime; 属性时间 unsigned long __unused3; unsigned long __unused4; unsigned long __unused5; } 二、掩码umask 在创建文件时,系统需要给该文件一个默认的权限,根据系统的安全性,用户可以自己设置当前系统,创建一个文件时的默认权限为0666-umask。 设置创建文件的掩码函数为umask,其声明如下: #include #include mode_t umask(mode_t mask); 函数如果执行成功,将设置系统的umask 值为参数mask,并返回系统原来文件权限umask 值。如果执行失败,将返回错误信息。 建立文件,文件的权限为0666-mask; 建立目录,目录权限为0777-mask。 三、无缓冲I/O 1.creat

Linux文件操作

一、创建文件 int creat(filename,mode) 成功返回文件描述符,失败返回-1 等效于open(filename,O_CREAT | O_WRONL Y | O_TRUNC,mode),二者成功都返回文件描述符 二、打开文件 int open(filename, flags) int open(filename, flags, mode) 成功:返回文件描述符 失败:返回-1 flags文件打开标志在fcntl.h中定义宏 O_RDONL Y:只读方式打开 O_WRONL Y:只写方式打开 O_RDWR:读写方式打开 O_APPEND:追加方式打开,原子操作,内核每次对该文件读写之前都将偏移量设置到文件尾端,避免多进程操作时写入的内容重叠交错 O_CREAT:创建一个文件,激活mode参数的使用(可以不用) O_EXCL:使用了O_CREAT时,文件已存在就报错(不是自动报错)O_NOBLOCK:非阻塞方式打开文件 O_TRUNC:如果文件已经存在,删除文件内容 注解:1、在任何情况下O_RDONL Y/O_WRONL Y/O_RDWR不能相互组合(以“|”)的方式组合 2、open("test.txt",O_CREAT | O_RDWR)等同test.txt文件存在时open("test.txt",O_RDWR) 3、open("test.txt",O_CREAT)可以在没有文件时创建文件 mode文件访问权限S_I(R/W/X)(USR/GRP/OTH) ▲其中R/W/X分别表示读/写/可执行权限▲USR/GRP/OTH分别表示用户/组/其他人S_IRWXG:组可读、写、执行 S_IRWXO:其他人可读、写、执行 S_ISUID:设置用户执行ID S_ISGID:设置组的执行ID 注解:1、以上选择项是sys/stat.h文件中定义的宏,可以通过“|”相互组合,决定文件访问权限 2、也可以用5个八进制数表示 第1位:设置用户ID (1有效0无效) 第2位:设置组ID (1有效0无效) 第3位:用户权限(1执行权限、2写权限、4读权限、0无)(需要求和) 第4位:组的权限(1执行权限、2写权限、4读权限、0无)(需要求和) 第5位:其他人的权限(1执行权限、2写权限、4读权限、0无)(需要求和) 3、open("test.txt",O_CREA T,10 705)创建一个用户可读可写可执行,其他人可读可执行,组 无权限,分析10705如下 1(设置用户ID),0(不设置组ID),7(1+2+4读、写、执行),0(没权限),5(1+4读、执行)

实验10-Linux文件操作(I)

实验10 Linux基本文件操作(I) 实验目的 熟悉与目录和文件操作相关的命令 实验内容与要求 (1)改变目录命令:cd 目标目录路径 步骤1:使用绝对路径依次进入Linux根目录下的所有子目录。 例如:cd /usr/bin 步骤2:使用绝对路径依次进入用户目录。 步骤3:使用相对路径进入子目录 1)使用绝对路径进入/lib目录 2)使用相对路径进入/lib/i868目录 3)使用相对路径退回到/lib目录 (2)列出并观察目录中的文件 步骤1:进入任意目录,使用无参数ls命令列出并观察其中所有文件; 步骤2:进入任意目录,使用通配符列出其中部分文件; 例如:cd /bin ls c* 步骤3:使用-l选项,列出目录中文件的各种属性,并观察识别这些属性。 步骤4:直接列出子目录中的文件。例如:ls i868 步骤5:仅列出子目录本身(-d) 步骤6:使用-F选项,显示文件类型标志。 步骤7:使用-a或-A选项,观察结果有什么变化。 步骤8:综合使用以上选项。 (3)目录的创建与删除 步骤1:在用户目录中,使用相对路径创建一个任意名称的目录,如“tmp”。 mkdir tmp 步骤2:删除该目录 rmdir tmp 步骤3:在根目录中,使用绝对路径在用户命令中创建一个子目录。 mkdir ~/tmp 步骤4:删除该目录 rmdir ~/tmp 步骤5:使用-p参数一次创建多级目录。如: mkdir ~/tmp/dir1 步骤6:使用-p参数删除多级目录。如: cd ~

rmdir tmp/dir1 (4)文件和目录拷贝命令:cp 步骤1:从/usr/include目录中,任选一个文件拷贝到用户目录的tmp子目录中 mkdir ~/tmp cp /usr/include/signal.h ~/tmp 步骤2:从/usr/include目录中,任选一个文件拷贝到用户目录的tmp子目录中,并改变其文件名。 cp /usr/include/signal.h ~/tmp/signal.bak 步骤3:思考并试验,如果步骤1中不使用第一条命令,拷贝的结果是什么?(5)文件移动或文件目录更名命令:mv 步骤1:将上面signal.bak更名为signal.h cd ~/tmp mv signal.bak signal.h 步骤2:将signal.h移动到上一层目录 mv signal.h .. 步骤3:将tmp目录更名为temp mv ../tmp ../temp 步骤4:拷贝/usr/include中所有s开头的.h文件到/usr/temp目录 cp /usr/include/s*.h /usr/temp 步骤5:将temp目录移动到tmp目录中 cd /usr mkdir /tmp mv temp tmp 步骤6:拷贝/usr/include/signal.h到/usr/tmp/temp目录中,观察提示。 步骤7:使用-f选项重复上述命令,观察是否有提示。 (6)建立符号链接命令:ln 步骤1:在用户目录中创建对/usr/include目录的符号链接 cd ~ ln –s /usr/include ls include 步骤2:删除该链接 rm include 步骤3:观察/usr/include是否被删除。 步骤4:与步骤1相同,但命名链接目录为abc ln -s /usr/include abc ls abc rm -f abc

linux文件IO操作

不带缓存的文件I/O 操作,主要用到5 个函数:open、read、write、lseek和close。这里的不带缓存是指每一个函数都只调用系统中的一个函数(不理解这句话的含义)。这些函数虽然不是ANSI C的组成部分,但是是POSIX 的组成部分。 open函数语法要点 |-- #i nclude // 提供类型pid_t的定义 所需头文件----|-- #i nclude |-- #i nclude 函数原型int open(const char *pathname,flags,int perms) pathname 被打开的文件名(可包括路径名) O_RDONLY:只读方式打开文件 O_WRONLY:可写方式打开文件 O_RDWR:读写方式打开文件 O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三个参数为其设置权限 O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一 函数传入值参数可测试文件是否存在 O_NOCTTY:使用本参数时,如文件为终端 终端不可用open()系统调用的那个进程的控制终端 O_TRUNC:如文件已经存在,并且以只读或只写成功打开,那么会先 全部删除文件中原有数据 O+APPEND:以添加方式打开文件,在打开文件的同时,文件指针指 向文件的末尾 perms 被打开文件的存取权限,为8进制表示法 函数返回值成功:返回文件描述符 失败:-1 补述:文件描述符 对于Linux 而言,所有对设备和文件的操作都使用文件描述符来进行的。文件描述符 是一个非负的整数,它是一个索引值,并指向内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。

相关主题
文本预览
相关文档 最新文档