一、文件描述符

  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. Mac Mysql初始化密码

    初始化密码 step1 苹果->系统偏好设置->最下面一行上点击mysql图标, 在弹出页面中 关闭mysql服务(点击stop mysql server) step2 登录终端:comm ...

  2. 解决方案 | AutoCAD 版本+版本号+受支持的 .NET SDK版本+.NET Framework版本

    关于 Managed .NET 兼容性 Managed .NET 应用程序通常与扩展基于 AutoCAD 的产品的行为和功能的公司和第三方应用程序关联. 在移植到最新版本后,并非所有 .NET 应用程 ...

  3. 解决方案 | 1分钟快速解决 win10 任务管理器性能不显示GPU?

    1 问题 环境:win10 22h2 2 解决方法 win+r输入dxdiag回车,查看下面信息: (1)确认你的Windows10版本号大于1909,如果确认,在任务管理器进程页右键名称一栏,将GP ...

  4. stable diffusion 实践与测试

    stable diffusion 实践与测试 放大 原图高清放大 原始图片 当不满意图片质量的时候 使用stable diffusion进行二次处理 选择适合图片风格的模型,再次根据图片写出提示词 输 ...

  5. 【SpringBoot】11 Web开发 Part2 模板引擎

    开发回顾: JavaWeb开发使用JSP技术,所有的页面文件必须是JSP,才能接受数据处理 JSP的好处是,数据交互方便,有JSTL补充 SpringBoot的区别: 我们最终的项目是一个jar包 内 ...

  6. 【Java-GUI】07 Swing01 入门案例

    Swing是Java自己开发出的一套GUI组件,不同于AWT去调用操作系统的GUI 正是因为非系统平台的GUI,所以程序运行的要慢一些 涉及的设计模式:MVC模式 Model(组件对象状态) View ...

  7. 切记:使用nvidia omniverse时一定要用2T的固态硬盘

    最近在用nvidia omniverse时突然发现这样的一个问题,那就是这个软件实在是太太了,一个组件就4个多GB大小,如果安装几个组件后那么几十GB的硬盘就没有了,同时由于这个体积太大,因此再启动和 ...

  8. nvidia 机器人仿真环境Isaac Sim

  9. 在docker 容器开启ssh , 并映射22端口到物理载体机上以使外网访问

    1.  运行某镜像以启动容器 docker run -it -p 127.0.0.1:5000:22 c7fe6d9267f8 /bin/bash -p 为指定端口, 127.0.0.1 为映射到的物 ...

  10. 如何使用Python环境下的2D经典游戏仿真器(openai推出的)retro库运行游戏"刺猬索尼克" (SonicTheHedgehog-Genesis)

    很多资料上都有使用游戏仿真器(openai推出的)retro库运行游戏"刺猬索尼克"  (SonicTheHedgehog-Genesis),但是均没有给出详细的安装该款游戏的步骤 ...