精华内容
下载资源
问答
  • 操作系统课程设计三、熟悉linux文件系统调用 实验内容 使用文件系统调用编写一个文件工filetool使其具有以下功能: 1.创建新文件 2.写文件 3.读文件 4.修改文件权限 5.查看当前文件权限 0.退出 提示用户输入功能号,...

    操作系统课程设计三、熟悉linux文件系统调用

    实验内容

    使用文件系统调用编写一个文件工filetool使其具有以下功能:

    1.创建新文件

    2.写文件

    3.读文件

    4.修改文件权限

    5.查看当前文件权限

    0.退出

    提示用户输入功能号,并根据用户输入的功能选择相应的功能。
    文件按可变记录文件组织,具体记录内容自行设计。

    实验功能及设计思路

    程序功能:

    1. 实现文件调用系统,实现linux文件系统调用
    2. 支持输入文件名,实现打开或创建文件(如果该文件不存在)
    3. 支持文件写入,在打开文件或者新建文件之后,用户可以如何任何内容加入到当前文件的后面。
    4. 支持读文件功能,展现文件信息
    5. 支持修改权限文件功能。例如777表示所有者,所属者和其他人都存在读写执行的权限。
    6. 支持查看文件类型,格式为-rwxrwxrwx-
    7. 支持退出当前文件,重新打开或者创建新的文件。

    设计思路:

    1. 了解linux文件调用的基本知识。
      用户在针对文件进行操作之前时一定要先打开它,这是由于系统需要根据用户提供的参数来查找文件的目录项,并由目录项找到文件的磁盘 i 结点,再将它调到内存 i 结点,才能建立用户进程与该文件之间的联系。
      同样,在文件操作完毕后要关闭文件,以切断用户进程与文件的联系,释放相关资源。
    Open 系统调用
    int open(const char *path, int flags);
    int open(const char *path, int flags,mode_t mode);

    一般情况下使用两个参数的格式,只有当打开的文件不存在时才使用 3 个参数的格式。参数:
    Path 指向所要打开的文件的路径名指针。
    int close(int fd)
    Fd 为打开文件时系统返回的文件标识符
    系统执行该系统调用时,根据 fd 值在该进程的进程打开文件表中找到 fd 标识,根据指针找到系统打开文件表,再找到内存 i 结点表中相应的 i 结点,对其 i_count 进行减 1 操作,
    然后释放系统打开文件表中的表项和进程打开文件表的表项。返回结果:调用成功返回 0

    1. 对于打开文件,首先输入文件名,如果文件存在,就直接打开,如果文件不存在则新建文件。给出提示信息。
    2. 对于写文件,首先判断文件是否打开,否则必须调用功能打开文件,然后使用过write(fd, buffer, strlen(buffer))系统函数写入文件。
    3. 对于修改文件权限,首先判断文件是否打开,否则必须调用功能打开文件。输入格式为777(或者其他权限),首先对模式分解,调用系统函数chmod。修改是否成功给出提示信息。
    4. 对于读文件,首先判断文件是否打开,否则必须调用功能打开文件。清空缓冲区,打印到界面。
    5. 查看文件权限,首先判断文件是否打开,否则必须调用功能打开文件。调用execv系统功能函数。
    6. 在实现每一个函数,采用功能聚集,每一个函数实现对于的功能。
    7. 在主函数中,设计程序界面,实现用户调用。

    源代码

    #include <iostream>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    using namespace std;
    char filename[50];
    int fd;
    bool opened=false;
    char* pargv[4] = { "ls", "-l", NULL, NULL };
    void create_open_file(){
          printf("请输入文件名\n");
          scanf("%s",filename);
          //读写方式打开,不存在就新建
          umask(0000);
          fd=open(filename,O_RDWR |  O_CREAT,0666);
          pargv[2] = (char*)malloc(50);
          strcpy(pargv[2], filename);
          if(fd<0){
                printf("打开失败\n");
          }
          else{
             opened=1;
             printf("打开成功\n");
          }
    }
    void write_file(){
          if(opened==0){
               printf("首先需要打开文件\n");
               return;
          }
          char buffer[1<<10];
          printf("请输入文件内容\n");
          scanf("%s",buffer);
          int returnnum=write(fd, buffer, strlen(buffer));
          if(returnnum!=-1){
                printf("写入成功!\n");
          }else{
                printf("写入失败!\n");
          }
    }
    void  mode_file(){
          if(opened==0){
                printf("首先需要打开文件\n");
               return;
          }
          int mode;
          printf("输入新的模式\n");
          scanf("%d",&mode);
       int mode_u = mode / 100;
        int mode_g = mode / 10 % 10;
        int mode_o = mode % 10;
        mode = (mode_u * 8 * 8) + (mode_g * 8) + mode_o;   //八进制转换
          int returnnum=chmod(filename, mode);
          if(returnnum==-1){
                printf("改变模式失败!\n");
          }
          else{
                 printf("改变模式成功!\n");
          }
    //      close(fd);
    //      opened=0;
    }
    void read_file(){
          if(opened==0){
              printf("首先需要打开文件\n");
              return;
          }
          char buffer[1<<10];
          memset(buffer,0,sizeof(buffer));
          //lseek() 定位一个已经打开的文件
          lseek(fd, 0, SEEK_SET);
          int returnnum=read(fd,buffer,1024);
          if(returnnum!=-1){
                printf("文件内容为:\n");
                printf("%s\n",buffer);
          }else{
               printf("读取失败\n");
          }
    //      close(fd);
    //      opened=0;
    }
    void view_mode(){
          if(opened==0){
                printf("首先需要打开文件\n");
               return;
          }
          printf("%文件权限为");//execv会停止执行当前的进程
          int returnnum = execv("/bin/ls", pargv);
          if(returnnum==-1){
                printf("查看失败\n");
          }
          else{
               printf("文件权限为:\n");
          }
    //      close(fd);
    //      opened=0;
    }
    int main()
    {
       printf("**********文件系统调用程序*********\n");
        int choice;
        while(1){
          printf("\n请选择您的选项\n");
          printf("1.新建(不存在)或者打开文件\n");
          printf("2.读文件\n");
          printf("3.写文件\n");
          printf("4.给文件权限修改\n");
          printf("5.查看文件权限\n");
          printf("6.关闭文件\n");
          scanf("%d",&choice);
          switch(choice){
           case 1:create_open_file();
                      break;
           case 2:read_file();
                      break;
           case 3:write_file();
                      break;
           case 4:mode_file();
                      break;
           case 5:view_mode();
                      break;
           case 6:close(fd);
                  opened=0;
                  break;
           default:
                printf("input error!!");
                break;
    
          }
        }
        return 0;
    }
    
    展开全文
  • Linux系统编程】Linux系统调用

    千次阅读 多人点赞 2019-09-22 20:52:34
    用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。 ...

    00. 目录

    01. 系统调用概述

    系统调用顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。

    从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。
    在这里插入图片描述

    系统服务之所以需要通过系统调用来提供给用户空间的根本原因是为了对系统进行“保护”,因为我们知道 Linux 的运行空间分为内核空间用户空间,它们各自运行在不同的级别中,逻辑上相互隔离。所以用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间函数。比如我们熟悉的“hello world”程序(执行时)就是标准的用户空间进程,它使用的打印函数 printf 就属于用户空间函数,打印的字符“hello word”字符串也属于用户空间数据。

    但是很多情况下,用户进程需要获得系统服务(调用系统程序),这时就必须利用系统提供给用户的“特殊接口”——系统调用了,它的特殊性主要在于规定了用户进程进入内核的具体位置;换句话说,用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核。有了这样的陷入内核的统一访问路径限制才能保证内核安全无误。我们可以形象地描述这种机制:作为一个游客,你可以买票要求进入野生动物园,但你必须老老实实地坐在观光车上,按照规定的路线观光游览。当然,不准下车,因为那样太危险,不是让你丢掉小命,就是让你吓坏了野生动物。

    02. 系统调用实现

    系统调用是属于操作系统内核的一部分的,必须以某种方式提供给进程让它们去调用。CPU 可以在不同的特权级别下运行,而相应的操作系统也有不同的运行级别,用户态和内核态。运行在内核态的进程可以毫无限制的访问各种资源,而在用户态下的用户进程的各种操作都有着限制,比如不能随意的访问内存、不能开闭中断以及切换运行的特权级别。显然,属于内核的系统调用一定是运行在内核态下,但是如何切换到内核态呢?

    答案是软件中断。软件中断和我们常说的中断(硬件中断)不同之处在于,它是通过软件指令触发而并非外设引发的中断,也就是说,又是编程人员开发出的一种异常(该异常为正常的异常)。操作系统一般是通过软件中断从用户态切换到内核态。

    中断有两个重要的属性,中断号和中断处理程序。中断号用来标识不同的中断,不同的中断具有不同的中断处理程序。在操作系统内核中维护着一个中断向量表(Interrupt Vector Table),这个数组存储了所有中断处理程序的地址,而中断号就是相应中断在中断向量表中的偏移量。更多详细说明请看《系统调用的实现原理》。

    03. 系统调用和库函数的区别

    Linux 下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。

    库函数由两类函数组成:

    1) 不需要调用系统调用

    不需要切换到内核空间即可完成函数全部功能,并且将结果反馈给应用程序,如strcpy、bzero 等字符串操作函数。

    2)需要调用系统调用

    需要切换到内核空间,这类函数通过封装系统调用去实现相应功能,如 printf、fread等。

    在这里插入图片描述

    系统调用是需要时间的,程序中频繁的使用系统调用会降低程序的运行效率。当运行内核代码时,CPU工作在内核态,在系统调用发生前需要保存用户态的栈和内存环境,然后转入内核态工作。系统调用结束后,又要切换回用户态。这种环境的切换会消耗掉许多时间。

    库函数访问文件的时候根据需要,设置不同类型的缓冲区,从而减少了直接调用 IO 系统调用的次数,提高了访问效率。缓冲区详情请看《浅谈标准I/O缓冲区》。

    这个过程类似于快递员给某个区域(内核空间)送快递一样,快递员有两种方式送:

    1. 来一件快递就马上送到目的地,来一件送一件,这样导致来回走比较频繁(系统调用

    2. 等快递攒着差不多后(缓冲区),才一次性送到目的地(库函数调用

    04. 附录

    参考:【Linux】一步一步学Linux系统编程教程汇总

    展开全文
  • Linux系统编程——Linux系统调用

    千次阅读 多人点赞 2015-04-17 20:40:33
    用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。 从逻辑上来...

    系统调用概述

    系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。


    从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。


    系统服务之所以需要通过系统调用来提供给用户空间的根本原因是为了对系统进行“保护”,因为我们知道 Linux 的运行空间分为内核空间用户空间,它们各自运行在不同的级别中,逻辑上相互隔离。所以用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间函数。比如我们熟悉的“hello world”程序(执行时)就是标准的用户空间进程,它使用的打印函数 printf 就属于用户空间函数,打印的字符“hello word”字符串也属于用户空间数据。

    但是很多情况下,用户进程需要获得系统服务(调用系统程序),这时就必须利用系统提供给用户的“特殊接口”——系统调用了,它的特殊性主要在于规定了用户进程进入内核的具体位置;换句话说,用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核。有了这样的陷入内核的统一访问路径限制才能保证内核安全无误。我们可以形象地描述这种机制:作为一个游客,你可以买票要求进入野生动物园,但你必须老老实实地坐在观光车上,按照规定的路线观光游览。当然,不准下车,因为那样太危险,不是让你丢掉小命,就是让你吓坏了野生动物。


    系统调用的实现

    系统调用是属于操作系统内核的一部分的,必须以某种方式提供给进程让它们去调用。CPU 可以在不同的特权级别下运行,而相应的操作系统也有不同的运行级别,用户态和内核态。运行在内核态的进程可以毫无限制的访问各种资源,而在用户态下的用户进程的各种操作都有着限制,比如不能随意的访问内存、不能开闭中断以及切换运行的特权级别。显然,属于内核的系统调用一定是运行在内核态下,但是如何切换到内核态呢


    答案是软件中断。软件中断和我们常说的中断(硬件中断)不同之处在于,它是通过软件指令触发而并非外设引发的中断,也就是说,又是编程人员开发出的一种异常(该异常为正常的异常)。操作系统一般是通过软件中断从用户态切换到内核态。
            

    中断有两个重要的属性,中断号和中断处理程序。中断号用来标识不同的中断,不同的中断具有不同的中断处理程序。在操作系统内核中维护着一个中断向量表(Interrupt Vector Table),这个数组存储了所有中断处理程序的地址,而中断号就是相应中断在中断向量表中的偏移量。更多详细说明请看《系统调用的实现原理》


    系统调用和库函数的区别

    Linux 下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。


    库函数由两类函数组成:

    1)不需要调用系统调用

    不需要切换到内核空间即可完成函数全部功能,并且将结果反馈给应用程序,如strcpy、bzero 等字符串操作函数。

    2)需要调用系统调用

    需要切换到内核空间,这类函数通过封装系统调用去实现相应功能,如 printf、fread等。



    系统调用是需要时间的,程序中频繁的使用系统调用会降低程序的运行效率。当运行内核代码时,CPU工作在内核态,在系统调用发生前需要保存用户态的栈和内存环境,然后转入内核态工作。系统调用结束后,又要切换回用户态。这种环境的切换会消耗掉许多时间。


    库函数访问文件的时候根据需要,设置不同类型的缓冲区,从而减少了直接调用 IO 系统调用的次数,提高了访问效率。缓冲区详情请看《浅谈标准I/O缓冲区》



    这个过程类似于快递员给某个区域(内核空间)送快递一样,快递员有两种方式送:

    1)来一件快递就马上送到目的地,来一件送一件,这样导致来回走比较频繁(系统调用

    2)等快递攒着差不多后(缓冲区),才一次性送到目的地(库函数调用


    资料参考:http://blog.csdn.net/orange_os

    展开全文
  • linux:文件系统系统调用

    千次阅读 2016-07-29 13:36:08
    当用户访问一个普通文件或者目录文件的内容,实际上...因此unix操作系统定义了几个与文件操作有关的系统调用。 1.打开文件 用户进程只能访问“打开的”文件。这个打开文件系统调用创建一个“打开文件”对象,并返

    当用户访问一个普通文件或者目录文件的内容,实际上是访问存储在硬件块设备上的一些数据。从这个意义上说,文件系统是硬盘分区物理组织的用户级视图。
    因为处于用户态的进程不能直接与底层硬件交互,所以每个实际的文件操作必须在内核态进行。因此unix操作系统定义了几个与文件操作有关的系统调用。
    1.打开文件
    用户进程只能访问“打开的”文件。这个打开文件的系统调用创建一个“打开文件”对象,并返回文件描述符的标识符。
    文件描述符表示进程与打开文件之间的交互,而打开文件对象包含了与这种交互相关的数据。
    2.访问打开的文件
    对普通UNIX文件,可以顺序访问,也可以随机访问,而对块设备和命名管道文件,通常只能顺序地访问。这两个访问方式中,内核把文件指针存放在打开文件对象中,也就是说,当前文件就是下一次进行读或写操作的位置。
    3.关闭文件
    4.更名以及删除文件
    更名或者删除一个文件时,不需要打开它。没有对这个文件的内容起作用,而是对一个或者多个目录的内容起作用。

    参考《深入理解LInux内核》

    展开全文
  • linux常见系统调用函数列表

    千次阅读 2017-05-11 09:41:18
    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很...
  • Linux系统调用和库函数调用

    千次阅读 2013-06-13 14:18:53
    Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。可以参考《Linux程序设计》(英文原版为《Beginning Linux Programming》,作者是Neil Matthew和Richard Stones)第三章:...
  • Linux文件系统详解

    万次阅读 多人点赞 2019-05-29 16:07:53
    从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。本文参考: http://blog.chinaunix.net/uid-8698570-id-1763151.html ...
  • Linux系统调用

    万次阅读 2012-04-21 20:39:29
    1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用、用户编程接口(API)、系统命令和内核函数的关系 5. Linux系统调用实例 6. Linux自定义系统调用 1.系统调用原理 系统...
  • linux 系统调用接口

    千次阅读 2013-12-20 10:06:54
    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互 联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也 ...
  • Linux系统调用列表

    千次阅读 2012-04-24 16:51:30
    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很...
  • 当我们打开一个文件的时候,需要获得文件的问价描述符,
  • linux常用系统调用函数

    千次阅读 2012-09-30 10:41:33
    (可能很多熟悉C++朋友马上就能联想起函数重载,但是别忘了Linux核心是用C语言写的,所以只能取成不同的函数名)。还有一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的...
  • 浅谈Linux系统调用代码相关

    千次阅读 2014-04-14 19:37:52
    内核代码的跳跃性造就了代码的难懂,本文对Linux中的系统调用实现代码做了简单分析,还有好多不懂,等待高手指点~~
  • LINUX系统调用

    千次阅读 2013-09-24 17:40:39
    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很...
  • linux系统调用write过程

    千次阅读 2013-10-13 11:34:28
    Linux下我们在使用设备的时候,都会用到write这个函数,通过这个函数我们可以象使 用文件那样向设备传送数据。可是为什么用户使用write函数就可以把数据写到设备里面 去,这个过程到底是怎么实现的呢? 这个...
  • linux系统调用reboot

    千次阅读 2015-04-01 10:28:12
    在内核中重启不如在用户空间中调用reboot或shutdown那样熟悉 其实reboot也不过是个系统调用,找到对应的系统调用的内核函数使用即可 sys_reboot 29298:内核中其他地方可能都没有sys_reboot的实现方法先进。其...
  • linux的全部系统调用加起来大约只有250个左右。 2.API:  API常以c库(libc)的形式提供,c库提供了绝大部分API,每个系统调用在c库中都有对应的封装函数(通常封装函数与系统调用的名称相同)。系统调用与c库函
  • 1.文件拷贝(系统调用方式)  #include #include #include #include int main() { char c; int in, out; in = open(“file.in”, O_RDONLY); out = open(“file.out”, O_WRONLY|O_CREAT, S_...
  • Linux2.6系统调用劫持介绍

    千次阅读 2012-01-25 17:24:06
    这篇文章就是对linux下劫持系统调用的介绍和资料的整理。 一、介绍  先介绍一下内核模块。内核模块是在操作系统需要的时候动态载入的目标文件对象,链接成内核的一部分,从而可以在不重新编译整个内核的
  • 在想要替换原有系统内核或者需要在原来的系统中添加一些系统调用的时候就会涉及到Linux内核的编译。但是内核编译虽然步骤简单,但是需要注意的东西还是太多了。首先一点就是由于Linux的开源性导致的版本问题,并不是...
  • Linux系统调用函数

    千次阅读 2011-12-12 10:36:09
    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很...
  • Linux文件系统

    万次阅读 2019-03-25 18:49:40
    Linux系统启动时,首先挂载根文件系统,之后可以自动或手动挂载其他的文件系统,这些文件系统要挂载到挂载点上,与虚拟文件系统(Virtual File System)和通用块设备层(General Block Device Layer)建立联系。...
  • linux系统调用列表

    千次阅读 2009-10-22 13:37:00
    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很...
  • Linux系统调用相关概念

    千次阅读 2013-02-16 15:30:07
    1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用、用户编程接口(API)、系统命令和内核函数的关系 5. Linux系统调用实例 6. Linux自定义系统调用 1.系统调用...
  • linux 系统调用详解

    千次阅读 2014-09-05 17:27:35
    但是很多情况下,用户进程需要获得系统服务(调用系统程序),这时就必须利用系统提供给用户的“特殊接口”——系统调用了,它的特殊性主要在于规定了用户进程进入内核的具体位置;换句话说,用户访问内核的路径是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,320
精华内容 38,528
关键字:

熟悉linux文件系统调用

linux 订阅