一、文件描述符

  1. 在unix操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统的文件,因此,所有的输入、输出都要通过读/写文件来完成。也就是说,通过一个单一的接口就可以处理外围设备和程序之间的所有通信。

  2. 读写文件前,需要打开文件。若系统检查文件存在,有访问权限,OS将向程序返回一个非负整数——文件描述符。系统负责维护已打开文件的所有信息,用户程序只能通过文件描述符引用文件。

  3. 命令解释程序(shell)运行程序时,将打开三个文件,对应文件描述符0、1、2, 依次表示stdin,stdout,stderr。

  4. 程序使用者可通过<>重定向程序的I/O。

    prog < 输入文件名

    prog > 输出文件名

  5. 文件指针和文件描述符的区别

C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括缓冲区和文件描述符。而文件描述符是文件描述符表的一个索引,也就是说c语言的文件指针是Linux系统中对文件描述符的一种封装。

二、低级I/O —— read和write

  1. 输入和输出时通过read和write系统调用实现的。

int n_read = read(int fd, char* buf, int n);

int n_written = write(int fd, char* buf, int n);

第一个参数是文件描述符,第二个参数是存放或读写的数据字符数组,第三个参数是要传输的字节数。

  1. 系统调用的函数原型都放在 syscalls.h 中。

三、open、creat、close和unlink

除了默认的stdin、 stdout、 stderr,其它文件都必须在读或写之前显式地打开。系统调用open、creat用于实现该功能。

  1. open 用于返回一个文件描述符。

  2. creat 用于创建一个文件,创建成功将返回一个文件描述符。

  3. unlink将文件从文件系统中删除,对应于标准库函数remove。

  4. 实现cp程序

#include <stdio.h>
#include <fcntl.h>
#include <stdarg.h>
#include <stdlib.h>
#include "syscall.h"
#include <unistd.h>
#define PERMS 0666
void error(char*, ...); int main(int argc, char* argv[]) {
int f1, f2, n;
char buf[BUFSIZ];
if(argc != 3){
error("Usage: cp from to");
}
if((f1 = open(argv[1], O_RDONLY, 0)) == -1){
error("%s: can't open %s", argv[0],argv[1]);
}
if((f2 = creat(argv[2], PERMS)) == -1){
error("%s: can't create %s, mode %03o", argv[0], argv[2], PERMS);
}
while((n = read(f1, buf, BUFSIZ)) > 0){
if(write(f2, buf, n) != n){
error("%s: write error on file %s", argv[0], argv[2]);
}
}
return 0;
} void error(char* fmt, ...){
va_list args;
va_start(args, fmt);
fprintf(stderr, "error:");
vprintf((const char *) stderr, args);
fprintf(stderr, "\n");
va_end(args);
exit(1);
}

四、随机访问——lseek

  1. long lseek(int fd, long offset, int origin)

offset是相当于origin指定位置的偏移。

origin为0、1、2用于指定offset从文件开始、从当前位置或从文件结束处开始算起。

  1. 写操作找到文件的末尾

lseek(fd, 0L, 2);

  1. 文件的开始处

lseek(fd, 0L, 0);

c程序设计语言 by K&R(五)UNIX系统接口的更多相关文章

  1. C程序设计语言(K&R) 笔记2

    (1) #include <stdio.h> main(){ int c; while((c = getchar()) != EOF){ putchar(c); } } 注意,因为 != ...

  2. C程序设计语言(K&R) 笔记1

    当作复习... (1)将华氏度 换算成 摄氏度,公式: ℃=(5/9)(̧°F-32) #include <stdio.h> int transformTemprature(int F){ ...

  3. UNIX系统接口

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

  4. [C程序设计语言]第五部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. 《C程序设计语言》【PDF】下载链接:

    <C程序设计语言>[PDF]下载 https://u253469.pipipan.com/fs/253469-230382180 内容简介 在计算机发展的历史上,没有哪一种程序设计语言像C ...

  6. C语言学习书籍推荐《C程序设计语言(第2版•新版)》下载

    克尼汉 (作者), 等 (作者, 译者), 徐宝文 (译者) 下载地址:点我 <C程序设计语言(第2版•新版)>是由C语言的设计者Brian W.Kernighan和Dennis M.Ri ...

  7. C程序设计语言(2)文摘

    第一章 导言 1.1 入门 1.2 变量与算术表达式 1.3 for语句 1.4 符号常量 1.5 字符输入输出 #include "stdafx.h" main(int argc ...

  8. 《C程序设计语言》(K&R)中文高清非扫描件

    <C程序设计语言>(K&R)中文高清非扫描件(带书签目录) 对于某下载东西都要C币的网站无爱了.好不容易找了一个,发出来看会不会帮到别人   附上addr:https://pan. ...

  9. K&R《C语言》书中的一个Bug

    最近在重温K&R的C语言圣经,第二章中的练习题2-2引起了我的注意. 原题是: Write a loop equivalent to the for loop above without us ...

  10. 【R语言系列】R语言初识及安装

    一.R是什么 R语言是由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman两个人共同发明. 其词法和语法分别源自Schema和S语言. R定义:一个能够自由幼小的用于统计计算和绘 ...

随机推荐

  1. MySQL中为什么要使用索引合并(Index Merge)?

    本文分享自华为云社区<[华为云MySQL技术专栏]MySQL中为什么要使用索引合并(Index Merge)?>,作者:GaussDB 数据库. 在生产环境中,MySQL语句的where查 ...

  2. var 和 let 在 jQuery中的区别

    下面通过代码案例来进一步解释 var 和 let 在 jQuery link 函数中的区别: (function ($) { $.fn.link = function () { // Example ...

  3. webpack4.15.1 学习笔记(二) — 配置及开发环境构建

    目录 基本安装 配置文件 管理资源 管理输出 构建一个开发环境 使用 source map 选择一个开发工具 观察模式 webpack-dev-server webpack-dev-middlewar ...

  4. oeasy教您玩转vim - 16 - # 行内贴靠

    行头行尾 回忆上节课内容 跳跃 向前跳跃是 f 向后跳跃是 F 继续 保持方向是 ; 改变方向是 , 可以加上 [count] 来加速 还有什么好玩的吗? 动手 #这次还是用无配置的方式启动 vi - ...

  5. ADB:移动端专项测试必备神器!!

    01 Android调试桥 (adb) Android调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信. adb命令可用于执行各种设备操作(例如安装和调试应用),并提供对Unix ...

  6. 将txt转化为csv的方法和遇到问题

    一.无法修改扩展名步骤如下 二.转换之后所有数据都挤在第一列 win10系统修改文件扩展名只需4部,打开我的电脑->查看->选择->查看->取消勾选(已知隐藏文件的扩展名)-& ...

  7. 如何理解自动驾驶的分级:L0、L1、L2、L3、L4、L5

    相关: https://baijiahao.baidu.com/s?id=1792281493472406727&wfr=spider&for=pc L0,就是完全没有自动驾驶技术的车 ...

  8. 中国版的huggingface——始智AI-wisemodel

    新闻: 始智AI-wisemodel社区正式上线,目标打造中国版"HuggingFace" 首先要知道,AI火热了7,8年了,不论是国内还是国外一直有要搞模型分享的网站,但是这东西 ...

  9. 开源机器学习版本的Github:Hugging Face

    参考: https://baijiahao.baidu.com/s?id=1776478347325976510 https://zhuanlan.zhihu.com/p/535100411 ==== ...

  10. 微软的GitHub Copilot

    随着OpenAI的ChatGPT4 Turbo的发布,基于ChatGPT的Copilot也推出了最新版. ======================================= 帮助文档: h ...