精华内容
下载资源
问答
  • 在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向 操作系统内核请求需要更高权限运行的服务。系统调用提供了用户程序与操作系统之间的接口( 即系统调用是用户程序和内核...

    参考回答:

    1)概念:

    在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向
    操作系统内核请求需要更高权限运行的服务。系统调用提供了用户程序与操作系统之间的接口(
    即系统调用是用户程序和内核交互的接口)。
    
    操作系统中的状态分为管态(核心态)和目态(用户态)。大多数系统交互式操作需求在内核态
    执行。如设备IO操作或者进程间通信。特权指令:一类只能在核心态下运行而不能在用户态下运
    行的特殊指令。不同的操作系统特权指令会有所差异,但是一般来说主要是和硬件相关的一些指
    令。用户程序只在用户态下运行,有时需要访问系统核心功能,这时通过系统调用接口使用系统
    调用。
    
    应用程序有时会需要一些危险的、权限很高的指令,如果把这些权限放心地交给用户程序是很危
    险的(比如一个进程可能修改另一个进程的内存区,导致其不能运行),但是又不能完全不给这些
    权限。于是有了系统调用,危险的指令被包装成系统调用,用户程序只能调用而无权自己运行那
    些危险的指令。另外,计算机硬件的资源是有限的,为了更好的管理这些资源,所有的资源都由
    操作系统控制,进程只能向操作系统请求这些资源。操作系统是这些资源的唯一入口,这个入口
    就是系统调用。
    

    2)系统调用举例:

    对文件进行写操作,程序向打开的文件写入字符串“hello world”,open和write都是系统调用。如下:
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<errno.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    int main(int argc, char *argv[])
    {
        if (argc<2)
            return 0;
        //用读写追加方式打开一个已经存在的文件
        int fd = open(argv[1], O_RDWR | O_APPEND);
        if (fd == -1)
        {
            printf("error is %s\n", strerror(errno));
        }
        else
        {
            //打印文件描述符号
            printf("success fd = %d\n", fd);
            char buf[100];
            memset(buf, 0, sizeof(buf));
            strcpy(buf, "hello world\n");
            write(fd, buf, strlen(buf));
            close(fd);
        }
        return 0;
    }
    还有写数据write,创建进程fork,vfork等都是系统调用。
    
    展开全文
  • 调用系统文件管理器

    热门讨论 2014-12-29 23:23:59
    这是一个调用android系统自带的文件管理器的例子
  • Linux文件系统调用

    万次阅读 2018-04-18 08:42:39
    Linux文件系统调用 文件描述符 操作系统识别文件的唯一标识。当进程创建一个新文件或者打开现有文件时,系统内核向进程返回一个文件描述符。范围为0~255 三个特殊的文件描述符 前三个文件标识符在系统中...

    Linux文件的系统调用

    文件描述符

    操作系统识别文件的唯一标识。当进程创建一个新文件或者打开现有文件时,系统内核向进程返回一个文件描述符。范围为0~255

    三个特殊的文件描述符

    前三个文件标识符在系统中规定为:
    #define STDIN_FILENO 0 //标准输入文件
    #define STDOUT_FILENO 1 //标准输出文件
    #define STDERROR_FILENO 2 //标准错误输出文件

    程序启动时会自动打开上述三个文件。

    库函数与系统调用的关系

    C语言的输入输出函数实际上调用的Linux内核的write、read等系统调用。read、write等函数在头文件:unisrd.h

    read、write等系统调用是Linux/Unix的上,只有在Linux/Unix平台上才有效。

    基本系统调用

    1. create() // 创建文件
    2. open() //打开文件
    3. read() //读文件
    4. write() //写文件
    5. close() //关闭文件
    6. lseek() //移动文件指针
    7. chmod() //改变文件权限
    8. chown() //改变文件所有者

    1.创建文件 create

    #include<sys/types.h>
    #include<sys/stat.h>    //包含着权限宏定义的头文件
    #include<fcntl.h>
    int creat(const char *pathname, mode_t mode);

    pathname:要创建文件的路径(绝对路径/相对路径)
    mode:要创建文件的权限
    返回值:若调用成功,则返回文件描述符;否则返回-1

    mode定义在头文件include/linux/stat.h中:

    2.打开文件 open

    #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);

    pathname: 文件路径(绝对路径/相对路径)
    flags: 打开方式
    mode:权限。可选参数,只在创建新文件时有效
    返回值:若调用成功,则返回文件描述符;否则返回-1

    参数flag说明:

    3.关闭文件 close

    #include<unistd.h>
    int close(int fd);

    fd: 要关闭文件的描述符
    返回值:若调用成功,则返回0;否则返回-1

    4.读文件 read

    #include<unistd.h>
    ssize_t read(int fd, const void *buf, size_t count);

    fd: 文件描述符
    buf:缓冲区指针,用于缓存从文件中读取的数据
    count:要读取的字节数
    返回值:执行成功,返回读取到的真正的字节数;失败则返回-1。

    例子,读入所有字节:

    ssize_t ret;
    while(len != 0 && (ret = read(fd, buf, len)) != 0)
    {
        if(ret == -1)
        {
            if(errno == EINTR)
                continue;
            perror("read");
            break;
        }
        len -= ret;
        buf += ret;
    }

    5.写文件 write

    #include<unistd.h>
    ssize_t write(int fd, const void *buf, size_t count);

    fd: 文件描述符
    buf:缓冲区指针,用于缓存准备写入文件的数据
    count:要写入的字节数
    返回值:执行成功,返回写入的真正的字节数;失败则返回-1。

    6.移动文件指针 lseek

    #include<unistd.h>
    #include<sys/types.h>
    off_t lseek(int fd, off_t offest, int whence);

    fd: 文件描述符
    offset:文件指针相对于whence的偏移量
    whence:偏移的基准位置
    返回值:返回实际相对于文件开头的偏移量

    7.改变文件权限 chmod

    #include<sys/types.h>
    #include<unistd.h>
    int chmod(const char *path, mode_t mode);

    path: 文件路径名(绝对路径/相对路径)
    mode:权限组合
    返回值:调用成功返回0;否则返回-1

    8.改变文件所有者 chown

    #include<sys/types.h>
    #include<unistd.h>
    int chown(const char *path, uid_t owner, gid_t group);

    path: 文件路径名
    owner:变更的UID
    group:变更的GID
    返回值:调用成功返回0;否则返回-1

    展开全文
  • 系统调用的概念和类型

    千次阅读 2018-08-15 20:35:28
    系统调用提供了用户程序和操作系统内核间的接口。 1.系统态和用户态 在实际运行过程中,处理机会在系统态和用户态间切换。相应地,现代多数OS将CPU的指令集分为特权指令和非特权指令两类。 (1)特权指令。特权...

    系统调用提供了用户程序和操作系统内核间的接口。

    1.系统态和用户态

    在实际运行过程中,处理机会在系统态和用户态间切换。相应地,现代多数OS将CPU的指令集分为特权指令和非特权指令两类。
    (1)特权指令。特权指令是指在系统态运行的指令,它对内部空间的访问范围基本不受限制,不仅能访问用户空间,也能访问系统空间。
    (2)非特权指令。非特权指令是运行在用户态的指令。应用程序所使用的都是非特权指令,它只能完成一般性的操作和任务,不能对系统中的硬件和软件直接进行访问,对内存的访问范围也局限于用户空间。

    2.系统调用

    系统调用本质上是应用程序请求OS内核完成某功能时的一种过程调用,它与一般的过程调用的几个差别:
    1.运行在不同的系统状态。一般的过程调用其调用程序和被调用程序运行在相同的状态——系统态或用户态,而系统调用最大的差别是:调用程序是运行在用户态,而被调用程序是运行在系统态。
    2.状态的转换。由于系统调用的调用和被调用过程是工作在不同的系统状态,因而不允许由调用过程直接转向被调用过程,需要通过软中断机制,先由用户态转换为系统态,经内核分析后,才能转向相应的系统调用处理程序。
    3.返回问题。在采用了抢占式(剥夺)调度方式的系统中,在被调用过程执行完成后,要对系统中所有要求运行的进程做优先权分析。当调用进程仍具有最高优先级时,才返回到调用进行继续执行;否则,将引起重新调用,以便优先权最高的进程优先执行。
    4.嵌套调用。像一般过程一样,系统调用也可以嵌套进行,即在一个被调用过程的执行期间,还可以利用系统调用命令去调用另一个系统调用。

    3.中断机制

    系统调用是通过中断机制实现的,并且一个操作系统的所有系统调用,都通过同一个中断入口来实现。

    4.系统调用的类型

    对于一般通用的OS而言,系统调用分为三大类:
    1.进程控制类系统调用
    主要用于对进程控制的系统调用有:
    (1)创建和终止进程的系统调用。
    (2)获得和设置进程属性的系统调用。进程的属性包括有进程标识符,进程优先级,最大允许执行时间等。
    (3)等待某事件出现的系统调用。
    2.文件操纵类系统调用
    (1)创建和删除文件
    (2)打开和关闭文件的系统调用
    (3)读和写文件的系统调用
    3.进程通信类系统调用
    在单机处理系统中,OS经常采用消息传递方式和共享存储区方式。
    当采用消息传递方式时,通信前需先打开一个连接。为此,应由源进程发出一条打开连接的系统调用,而目标进程则应利用接受连接的系统调用表示同意进行通信;然后,在源和目标进程之间便开始通信。可以利用发送消息的系统调用或者用接收消息的系统调用来交换信息。通信结束后,还须再利用关闭连接的系统调用结束通信。
    用户在利用共享存储区进行通信之前,须先利用建立共享存储区的系统调用来建立一个共享存储区,再利用建立连接的系统调用将该共享存储区连接到进程自身的虚地址空间上,然后便可以利用读和写共享存储区的系统调用实现相互通信。

    展开全文
  • 一、文件描述符 概念:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件...

    一、文件描述符

    概念:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

    文件描述符主要用于read、write、close、lseek

    二、文件操作函数

    1、int open(const char *pathname,int flag,/*int mode*/);

    pathname:指定打开的文件的路径+文件名

    flag:操作模式:以O_RDONLY(只读),O_WRONLY(只写),O_RDWR(读写),O_CREAT(创建)文件不存在就创建

    mode:指定新创建文件的权限,只有在O_CREAT时,才会需要

    功能描述:用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。

    返回值:-1,出错

    2、int read (int fd,void*buff,int size);

    fd:将要读取数据的文件描述符

    buff:指定获取的数据在程序中存储的起始位置

    size:本次最多读取的字节个数,一般为缓冲区的大小

    返回值:-1,出错     成功:返回读到的字节个数

    功能描述: 从文件读取数据。

    3、int write ( int fd,void *buff ,int datalen);

    fd:写数据的文件描述符

    buff:指定需要写入数据的起始位置

    datalen:写入数据的长度

    返回值:-1,出错   成功:返回写入的字节个数

    功能描述:向文件写入数据

    4、int close(int fd);

    fd:文件描述符

    返回值:0成功,-1出错

    功能描述:用于关闭一个文件

    5、int lseek(int fd,int pos,int flag);

    pos:位置

    flag:标记

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

    SEEK_CUR 当前,当前位置为指针的位置,新位置为当前位置加上偏移量

    SEEK_END 尾/结束,当前位置为文件的结尾,新位置为文件大小加上偏移量的大小

    返回值:失败返回-1,成功返回当前位移

     

    三、系统调用与库函数的区别

    进程直接调用内核暴露出来的的接口的方式称为系统调用;而调用将内核暴露出来的借口封装好的函数的方法为库函数的调用,有的库函数不需要封装内核暴露出来的接口。

    库函数:在用户态调用,在用户态执行

    系统调用函数:在用户态调用,在内核态执行

    问题:

    库函数与系统调用函数哪个执行效率高?

    当处理的数据量比较小时,函数库的函数执行效率比较好,因为函数库的函数的作法是将要处理的数据先存入缓冲区内,等到缓冲区装满了,再将数据一次写入或者读出。这种方式处理小量数据时效率比较高。但是在进行系统调用时,因为用户进程从用户模式进入系统内核模式,中间涉及了许多额外的任务的切换工作,这些操作称为上下文切换,此类的额外工作会影响系统的执行效率。那么为什么还要使用系统调用呢?这是因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言),使用库函数调用可以大大减少系统调用的次数。这是因为缓冲区技术。在用户空间和内核空间,对文件操作都使用了缓冲区,当内核缓冲区写满之后或写结束之后才将内核缓冲区内容写到文件对应的硬件媒介中。

    系统调用函数与库函数的联系

        系统调用通常是用于底层文件的访问,例如在驱动程序中对设备文件的直接访问,而库函数是对系统调用的一层封装,因此在用库函数对文件操作的时候,必然会引起系统调用。也就是说,库函数调用实际上是通过系统调用实现的,例如:C库函数fwrite()就是通过write实现的。
     

    四、用户态切换内核态

    1、调用系统调用函数    →    软中断

    2、缺页异常     →   硬中断

    五、缓冲区

    分为输入缓冲区(scanf)、输出缓冲区(printf)

    输出缓冲区的条件:

    1、程序结束(不能以_exit/_Exit结束);

    2、遇到“\n”;

    3、主动刷新fflush(stdout);

    4、缓冲区满

     

    展开全文
  • 基本IO系统调用(C语言)

    千次阅读 2019-07-29 10:11:07
    文件描述符 非负整数 定义形式 int fd; 标准文件描述符定义 STDIN_FILENO(0) STDOU_FILENO(1) STDERR_FILENO(0) 文件操作的一般过程 打开-读/写/-[定位]-关闭 出错处理 UINX风格 返回值 "errno"变量(“/usr/...
  • 系统调用

    千次阅读 多人点赞 2019-03-02 17:47:48
    程序接口通常是由各种类型的系统调用所组成的,因而,也可以说,系统调用提供了用户程序和操作系统之间的接口,应用程序通过系统调用实现其与 OS 的通信,并可取得它的服务。 处理器(CPU)=运算器+控制器+...
  • Linux系统调用列表

    万次阅读 多人点赞 2017-12-09 16:45:10
    文件 fork 创建一个新进程 kernel/fork.c clone 按指定条件创建子进程 kernel/fork.c execve 运行可执行文件 fs/exec.c exit 中止进程 kernel/exit.c _exit 立即中止当前进程 getdtablesize 进程...
  • 在 Android 手机文件管理中,点击某个文件的时候,会弹出选择打开文件的方式,那么,如果在我们自己的软件中要实现这种效果该怎么做呢?其实 Android 打开本地文件很常见,打开的时候会根据不同的文件类型来执行,...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    halt执行时,杀死应用进程,执行sync(将存于buffer中的资料强制写入硬盘中)系统调用文件系统写操作完成后就会停止内核。若系统的运行级别为0或6,则关闭系统;否则以shutdown指令(加上-h参数)来取代。  ...
  • C++ 函数调用和系统调用的区别

    千次阅读 2018-02-06 10:59:27
     所谓系统调用就是用户在程序中调用操作系统所提供的一个子功能,也就是系统API,系统调用可以被看做特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如...
  • 文件属性及系统调用(C语言)

    千次阅读 2019-07-29 10:11:57
    获取文件状态 头文件 #inlcude<sys/types.h> #include<sys/stat.h> #include<unistd.h> 函数原型 int stat(const char file_name,struct statbuf); int fstat(int filedes,st...
  • 一、选择文件系统文件管理器】 import android.annotation.SuppressLint; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; ...
  • 常用文件服务器

    万次阅读 2019-03-16 15:20:13
    常用文件服务器: (主要说一些基础知识,配置过程简单,可以百度下,小编主要整理下知识点) 一、FTP 服务器 软件包: vsftpd FTP端口: 控制端口 21/tcp 数据端口 20/tcp (主动模式) 配置文件: /etc/vsftpd/...
  • android 调用系统文件管理器

    万次阅读 多人点赞 2018-07-11 09:09:23
    今天,简单讲讲android如何调用系统文件管理器获取目录下的文件资源。这几天,还是因为搬家的事,导致自己状态很差。和领导说想要辞职,领导说还是先适应一下在说。所以还是坚持了。这个其实也很简单,之前做一个...
  • 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,...
  • Android调用系统应用打开各种类型文件
  • Linux添加系统调用

    千次阅读 2019-05-09 21:47:35
    修改内核代码添加函数,添加函数声明以及添加系统调用id,来实现给自己编译的内核添加系统调用。当然这个过程是在编译内核之前完成的,内核编译过程请参照Linux内核编译 添加系统调用 进入解压的文件目录 cd /usr/...
  • 列举几种系统调用

    千次阅读 2013-01-11 12:07:11
    操作系统实现的所有系统调用所... Linux系统调用,包含了大部分常用系统调用和由系统调用派生出的的函数。 一、进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exi
  • 从实现的角度:系统调用直接对文件和设备进行访问和控制的的一组底层接口, 而标准I/O库为地城I/O调用提供了一个通用的接口,系统调用直接跟底层打交道,系统调用移植性远不如标准I/O库好。 从性能的角度:使用系统...
  • Linux系统编程——系统调用之 I/O 操作(文件操作)

    万次阅读 多人点赞 2015-05-20 14:12:59
    我们可以系统调用中 I/O 的函数(I:input,输入;O:output,输出),对文件进行相应的操作( open()、close()、write() 、read() 等)。 打开现存文件或新建文件时,系统(内核)会返回一个文件描述符,文件...
  • read 系统调用剖析

    千次阅读 2015-11-20 17:27:37
    Read 系统调用在用户空间中的处理过程 Linux 系统调用(SCI,system call interface)的实现机制实际上是一个多路汇聚以及分解的过程,该汇聚点就是 0x80 中断这个入口点(X86 系统结构)。也就是说,所有系统调用...
  • 系统调用和库函数调用的区别

    千次阅读 2018-09-04 16:19:24
    一:系统调用和库函数调用的区别: 1:系统调用是最底层的应用,是面向硬件的。而库函数的调用是面向开发的,相当于应用程序的API(即预先定义好的函数)接口; 2:各个操作系统的系统调用是不同的,因此系统调用...
  • 用这段代码跳转到系统文件管理器了。 但是没有保存按钮该怎么保存?能不能在跳转的界面上添加个保存按钮 ![图片说明](https://img-ask.csdn.net/upload/201603/30/1459329298_876563.jpg)想要的效果! [图片...
  • 操作系统作业:给linux系统增加一个系统调用

    万次阅读 多人点赞 2018-06-01 00:43:37
    前不久开了一门《操作系统》,老师上课留下了一个作业——给Linux系统添加一个系统调用。刚开始只能用一脸懵逼来形容,只能硬着头皮做下去。由于刚的新电脑,所以就没敢装双系统。所以我选择了虚拟机,虚拟机刚开始...
  • 当我们打开一个文件的时候,需要获得文件的问价描述符,
  • linux文件系统调用(2)---umount

    千次阅读 2014-11-24 23:07:00
    本文将介绍linux卸载文件系统的过程,从系统调用umount()函数开始解析,主要分为三个阶段: 1、查找挂载目录下所有已挂载的文件系统; 2、删除这些已挂载文件系统的挂载节点; 3、释放这些已挂载文件系统的挂载点...
  • 【Linux系统编程】Linux系统调用

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

    千次阅读 2019-01-13 17:45:35
    Linux系统调用指南 格式后头慢慢调,暂时先这样 原文链接: blog.packagecloud.io https://zcfy.cc/article/the-definitive-guide-to-linux-system-calls-670.html?t=new 这篇blog解释linux程序如何调用linux内核...
  • 上传时需要用到调用系统自带的文件管理器来选择文件,后来就在考虑怎么调用,网上也搜了很久,没有很好的解决方法,后来在一瞬间发现了一篇不错的文章,借鉴了一下代码。 [java] view plain copy...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,111,335
精华内容 844,534
关键字:

常用的文件系统调用有哪些