• UNIX系统接口


    UNIX系统接口

    8.1 文件描述符

    UNIX操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统中的文件。系统通过文件描述符来标识文件:标准输入为0,标准输出为1,标准错误为2。

    当程序的输入/输出被重定向时,shell把文件描述符0和1的默认赋值改变为指定的文件。

    8.2 低级I/o——read和write

    read和write是UNIX的两个系统调用,这两个函数中,第一个参数是文件描述符,第二个参数是程序中存放读或写的数据的字符数组,第三个参数是要传输的字节数。

    int read(int fd,char *buf,int n);
    int write(int fd,char *buf,int n);

    每个调用返回实际传输的字节数。在读文件时,函数的返回值可能会小于请求的字节数,如果返回0,则表示已经达文件的结尾;如果返回-1,则表示发生了某种错误。在写文件时,返回值是实际写入的字节数。如果返回值与请求写入的字节数不相等,则说明发生了错误。

    下面是用read和write构造getchar的两个版本:

    第一个版本:它通过每次从标准输入读入一个字符来实现无缓冲输入

    #include "syscalls.h"
    int getchar(void)
    {
        char ch;
        return (read(0,&ch,1))==1?(unsigned char)ch:EOF;
    }

    第二个版本:每次读入一组字符,但是每次只输出一个字符

    #include "syscalls.h"
    int getchar(void)
    {
        static char buf[BUFSIZ];
        static char *bufp=buf;
        static int n;
        if (n==0)
        {
            n=read(0,buf,BUFSIZ);
            bufp=buf;
        }
        return --n>0?(unsigned char)*(--bufp):EOF;
    }

    8.3 open、cat、close和nulink

    open和C函数库的fopen类似,只是前者返回的文件描述符,如果发生错误,则返回-1

    #include<fcntl.h>
    int fd;
    int open(char *name,int flag,int perms);
    fd=open(name,flag,perm);

    其中flag可以有的状态为O_RDONLY、O_WRONLY、O_RDWR分别代表,只读,只写,读写方式。

    如果open打开一个不存在的文件,是将导致错误,可以使用creat系统调用创建新的文件或覆盖已有的旧文件,如下所示:

    int creat(char *name, int perms);
    fd = creat(name,perms);

    如果creat成功创建了文件,它将返回一个文件描述符,否则返回-1。如果此文件已存在,creat将把该文件的长度截断为0,从而丢弃原先已有的内容,使用creat创建一个已存在的文件不会导致错误。

    perms用来指定权限,UNIX文件系统中每个文件对应一个9比特的权限信息,因此,通过一个3位的八进制数就可以方便地说明不同的权限。

    函数close(int fd)用来断开文件描述符和已打开文件之间的连接,并释放此文件描述符,以供其他文件使用。

    函数unlink(char* name)将文件name从文件系统中删除,它对应于标准库函数remove

    8.4 随机访问——lseek

    long lseek(int fd,long offset,int origin);

    将文件描述符为fd的文件的当前位置设置为offset,其中,offset是相对于orgin指定的位置而言的,随后进行的操作从此位置开始。origin的值可以为0、1或2,分别用于指定offset从文件开始、从当前位置或从文件结束开始算起

    lseek系统调用返回一个long类型的值,此值表示文件的新位置,若发生错误,则返回-1。

    下面这个函数将从文件的任意位置读取任意数目的字节数,返回读入的字节数,若错误则返回-1

    #include "syscalls.h"
    
    /*get函数:从pos位置处读入n个字节*/
    int get(int fd,long pos,char *buf,int n)
    {
        if((lseek(fd,pos,0))>0)
            return read(fd,buf,n);
        else
            return -1;
    }

    以下内容待续…

    8.5 实例——fopen和getc函数的实现

    8.6 实例——目标列表

    8.7 实例——存储分配程序

     

     

     

     

     

    分类: C/C++

  • 相关阅读:
    JAVA中final关键字的作用
    JAVA作用域和排序算法介绍
    JAVA的控制结构
    Java概述
    P6329 【模板】点分树 | 震波[点分树]
    BZOJ #4771. 七彩树 [主席树,链并,差分]
    CF1276F Asterisk Substrings [后缀自动机]
    P4173 残缺的字符串 [FFT]
    CF528D Fuzzy Search [FFT]
    #4589. Hard Nim [FWT]
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3339278.html
Copyright © 2020-2023  润新知