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++

UNIX系统接口的更多相关文章

  1. Unix及类Unix系统文本编辑器的介绍

    概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...

  2. UNIX系统基本结构

    UNIX系统的基本结构如图所示.整个UNIX系统可分为五层:最底层是裸机,即硬件部分:第二层是UNIX的核心,它直接建立在裸机的上面,实现了操作系统重要的功能,如进程管理.存储管理.设备管理.文件管理 ...

  3. 《Linux/Unix系统编程手册》读书笔记1

    <Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...

  4. UNIX标准化及实现之UNIX标准化、UNIX系统实现、标准和实现的关系以及ISO C标准头文件

    一.UNIX标准化 1.ISO C (International Organization for Standardization) 2.IEEE POSIX (Institue of Electri ...

  5. Python OS模块标准库的系统接口及操作方法

    Python OS模块标准库的系统接口及操作方法 os.name 返回当前操作系统名,定义了'posix','nt','mac','os2','ce','java'(我使用win7/python3.1 ...

  6. UNIX 系统上的文本操作简介

    http://www.oschina.net/question/129540_53561 UNIX 的基本哲学之一就是创建只做一件事并将这一件事做好的程序(或进程).这一哲学要求认真考虑接口以及结合这 ...

  7. 《Linux/Unix系统编程手册》 时间子系统

    Linux下操作系统编程有两本经典APUE即<Advanced Programming in the UNIX Environment>和TLPI<The Linux Program ...

  8. 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll

    关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...

  9. Unix系统编程()改变信号处置:signal

    Unix系统提供了两种方法来改变信号处置:signal和sigaction.这篇描述的是signal系统调用,是设置信号处理的原始API,所提供的接口比sigaction简单.另一方面,sigacti ...

随机推荐

  1. 注册 集 与 删除 -- C

    文章3位设置和清除操作. #include <stdio.h> #include <stdlib.h> #include <string.h> #define BI ...

  2. Postman 是一个非常棒的Chrome扩展,提供功能强大的API & HTTP 请求调试

    Postman 是一个非常棒的Chrome扩展,提供功能强大的API & HTTP 请求调试   需要FQ才能安装,使用时应该不用FQ了,除非使用postman的历史记录功能:   非常棒的C ...

  3. 【高德地图API】从零开始学高德JS API(八)——地址解析与逆地址解析

    原文:[高德地图API]从零开始学高德JS API(八)——地址解析与逆地址解析 摘要:无论是百度LBS开放平台,还是高德LBS开放平台,其调用量最高的接口,必然是定位,其次就是地址解析了,又称为地理 ...

  4. WebBrowser!

    原文:WebBrowser! 我现在先放一些基础的文章在这里,以后再放别的上来官方范例连接http://www.microsoft.com/china/msdn/library/langtool/vc ...

  5. android studio 添加到项目库中的项目

    工程-对-new module-Android Library-module name和package name 它应该在同一个库被引入. 然后在该文件夹replace新的library 在gradl ...

  6. [Unity3D]Unity3D游戏开发之刀光剑影特效的实现

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 我实在不明确有的人为什么不喜欢武侠/仙侠类游戏,也许是因为武侠/仙侠类游戏身上被永远烙上的国 ...

  7. MySQL的备份与还原

    原文:MySQL的备份与还原 MySQL备份和还原,都是利用mysqldump.mysql和source命令来完成的. 1.Win32下MySQL的备份与还原 1.1 备份 开始菜单 | 运行 | c ...

  8. monkey源码分析之事件注入方法变化

    在上一篇文章<Monkey源码分析之事件注入>中,我们看到了monkey在注入事件的时候用到了<Monkey源码分析番外篇之Android注入事件的三种方法比较>中的第一种方法 ...

  9. sql点滴42—mysql中的时间转换

    原文:sql点滴42-mysql中的时间转换 UNIX时间戳转换为日期用函数: FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 日期转换为UNIX时 ...

  10. PHP 9: 表达式

    原文:PHP 9: 表达式 本章介绍PHP的表达式.PHP的表达式其实和其他语言没有什么区别.普通的赋值是表达式,函数也是表达式,通过函数赋值也是.三元条件运算符也是,即: $first ? $sec ...