Linux文件系统.ppt

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VFS的系统调用
8.fcntl系统调用 调用的作用: 一是设置文件的访问标志,主要由open和fcntl两个调用实 现;另一个是对文件进行上锁,主要由chmod和fcntl调用 实现。 调用格式: int fcntl(int fd, int cmd, [long arg]); cmd为控制命令,说明所要实现的功能
VFS的系统调用
VFS的系统调用
1.open系统调用
mode是文件访问权限,分为文件所有者、文件用户组和其他用户:
S_IRUSR 读权限,文件主
S_IWUSR 写权限,文件主
S_IXUSR 执行权限,文件主 S_IRWXU 文件主,可读可写可执行 S_IRGRP 读权限,文件用户组
R:read W:write
VFS的系统调用
3.read系统调用 调用格式: int read(int fd,void *buf, size_t nbytes); fd为打开文件系统调用返回的文件标识符 buf为指定的缓冲区 nbytes为要读的字节数 所用头文件: #include <sys/types.h> #include <unistd.h>
int fd; char c; fd=open(argv[1],O_RDONLY); lseek(fd,10,SEEK_SET); while(read(fd,&c,1)==1)
putchar(c); }
VFS的系统调用
6.chown系统调用 调用的作用: 修改文件所有者的标识或组标识,只有超级用户才能使用。 调用格式: int chown(char *pathname, uid_t owner, gid_t group); pathname为被操作文件的路径名 owner 和 group 分 别 给 出 文 件 所 有 者 标 识 和 组 标 识 。 若 owner或group的值为-1,则文件对应的标识符不变,若在 一个只读文件系统对文件进行chown操作则调用将失败。
open("file3",O_WRONLY|O_CREAT|O_EXCL,MODE);
VFS的系统调用
2.close系统调用 调用格式: int close(int fd); fd 为打开文件时的系统返回的文件标识符。 所用头文件: #include <unistd.h>
VFS的系统调用
2.close系统调用 调用过程:
VFS的系统调用
VFS的系统调用
5.lseek系统调用
调用功能: 对文件进行随机读写。 调用格式: off_t lseek(int fd, off_t offset, int whence); offset为文件偏移,它被加到所先的基地址上给出新的文件偏移值 whence可以取下列值之一: SEEK_SET定义为0,文件读写指针被置为offset给定的值 SEEK_CUR定义为1,文件读写指针被置为当前读写指针的值加上offset 给定的值 SEEK_END定义为2,文件读写指针被置为文件大小加上offset给定的值
open("file2",O_WRONLY|O_CREAT|O_EXCL,MODE);
例3 使用open()创建一个可读可写的文件,文件名为file3, 其权限为文件主可读可写可执行,用户组可读,其他可执行 。
#define MODE 0741// 等价于S_IRWXU|S_IRGRP|S_IXOTH
例1 使用open()创建一个可读可写的文件,文件名为 file1
open("file1",O_RDWR|O_CREAT);
例2 使用open()创建一个可读可写的文件,文件名为file2,其权 限为文件主可读可写可执行,用户组可读可写,其他可执行。
#define MODE 0761// 等价于S_IRWXU|S_IRGRP|S_IWGRP|S_IXOTH
exit(0);
}
例7 假设当前目录下有文件file,其内容是 26个英文字母。编程序移动指针到第10个 字符,使其从第11个字符开始输出,直到 最后一个字符。
#include <stdio.h> #include <fcntl.h> main(int argc, char *argv[ ]) {
S_IWGRP 写权限,文件用户组 S_IXGRP 执行权限,文件用户组 S_IRWXG S_IROTH 读权限,其他用户
X:execute USR GRP
S_IWOTH 写权限,其他用户 S_IXOTH 执行权限,其他用户
OTH
S_IRWXO
VFS的系统调用
1.open系统调用 所在头文件: #include <sys/types.h> #include <sys/stat.h> #include <sys/fcntl.h>
exit(1);`
}
else
printf("open file:hello.c %d\n",fd);
if((size=write(fd,buf,len))<0)
{
perror("write:");
exit(1);
}
else printf("Write:%s\n",buf);
lseek(fd,0,SEEK_SET);
VFS的系统调用
7.chmod系统调用
调用格式: int chmod(char *pathname, mode_t mode); mode 为 文 件 的 存 取 权 限 , 在 头 文 件 /usr/src/linux2.4/include/linux/stat.h中描述 注意: 调用chmod的进程其有效用户必须是超级用户或文件所有者,否则调 用失败。 权限也可以采用数值方法设备,但要先用下列语句定义: #define MODE 权值 所用头文件: #include <sys/types.h> #include <unistd.h>
系统执行该系统调用时根据fd值在该进程的进程打开文件表中找到fd标 识,根据指针找到系统打开文件表,再找到内存i结点表中相应的i结点 ,对其i_count进行减1操作,然后释放系统打开文件表中的表项和进程 打开文件表的表项。 调用成功返回0,失败返回-1。 注意: 对于标准输入/输出/出错文件,其默认的文件标识符为0.1.2,所以, 如果调用了close(0),则系统执行的是关闭标准输入设备,释放其标识 符0并重新分配。
syslog(LOG_INFO, "Error! "); return(0); }
例6 程序如下 #include <sys/types.h> #include <unistd.h> main() {
char buffer[128]; int num; num=read(0,buffer,128); if((write(1,buffer,num))!=num)
write(2, "A write error has occurred\n",27); exit(0); }
例4 程序分两步:首先,创建2个文件file1和file2,输 出它们的文件标识符后关闭。输出结果将显示:系统对 于进程所打开的文件标识符一般是从3号开始分配(0-2号 为标准文件占用)。然后,程序中使用关闭文件操作释放 了 0 号 标 准 输 入 与 2 号 标 准 出 错 文 件 , 再 次 打 开 file1 和 file2,输出它们的文件标识符后关闭。输出结果将显示 :一旦将0-2号释放后,则其号码可以再次分配给其他文 件。所以当再次打开文件file1时,其标识符就是0号了 。
VFS的系统调用
1.open系统调用 调用功能:获得被允许访问的文件标识符。
调用格式: int open(const char *path, int flags, [mode_t mode]); *path参数为指定路径 flags参数为打开方式。常见访问模式有: O_RDONLY即只读 O_WRONLY即只写 O_RDWR即读写模式 还可利用按位或“|”对下列标志任意组合: O_APPEND即追加数据 O_TRUNC O_EXECL O_CREAT即结合mode参数创建文件。
例8 使用fcntl系统调用给文件上锁并检测锁的信息。
#include <sys/types.h> #include <sys/stat.h> #include <syslog.h> void show_lock_info(struct flock *arg); main() {
char *path="file"; mode_te mode=S_IWUSR; if(chmod(path, mode))
VFS的系统调用
3.read系统调用 调用功能: 从指定文件中读取指定长度的内容到指定的缓冲区。
VFS的系统调用
4.write系统调用 调用格式: int write(int fd, void *buf, size_t nbytes); fd为打开文件系统调用返回的文件标识符 buf为指定的缓冲区 nbytes为要读的字节数 调用功能: 将指定的数据以指定的大小写入指定的文件中。
char *buf="Hello!I'm writing to this file!";
char buf_r[10];
len=strlen(buf);
if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0)
{
perror("open:");
if((size=read(fd,buf_r,15))<0)
{
perror("read:");
exit(1);
}
else printf("read from file:%s\n",buf_r);
if(close(fd)<0)
{
perror("close:");
exit(1);
}
else
printf("Close hello.c\n");
VFS的系统调用
6.chown系统调用 调用功能: 执行chown后,原来的文件主可能因文件主的改变而失去对 文件的访问权。实际使用中,该调用更多地用来改变文件的 组标识,实现文件的组间转换,以便多用户对同一文件实施 控制。 所用头文件: #include <sys/types.h> #include <unistd.h>
lseek(fs, OL, 0)
获取文件指针的当前位置:
lseek(fs, OL, 1)
例7 read,write和lseek函数使用实例。
#include <unistd.h>
#include <fcntl.h> #define MAXSIZE
int main(void)
{
int fd,size,len;
VFS的系统调用
5.lseek系统调用
返回值:文件指针的新位置
所用头文件: #include <stdio.h> #include <fcntl.h>
注意,实际应用中,lseek()有以下3种本的应用情况。
将文件定位到由offset给定的位置0: lseek(fs,offset,0)
将文件指针定位到文件尾:
#include <stdio.h> #include <fcntl.h> main() {
int fd1,fd2; fd1=open("file1",O_WRONLY|O_TRUNC|O_CREAT,0666); fd2=open("file2",O_WRONLY|O_TRUNC|O_CREAT,0666); printf("First:fd1=%d,fd2=%d\n",fd1,fd2); close(fd1); close(fd2); close(0); fd1=open("file1",O_WRONLY); close(2); fd2=open("file2",O_RDONLY); printf("First:fd1=%d,fd2=%d\n",fd1,fd2); }
相关文档
最新文档