c程序设计语言 by K&R(五)UNIX系统接口
一、文件描述符
在unix操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统的文件,因此,所有的输入、输出都要通过读/写文件来完成。也就是说,通过一个单一的接口就可以处理外围设备和程序之间的所有通信。
读写文件前,需要打开文件。若系统检查文件存在,有访问权限,OS将向程序返回一个非负整数——文件描述符。系统负责维护已打开文件的所有信息,用户程序只能通过文件描述符引用文件。
命令解释程序(shell)运行程序时,将打开三个文件,对应文件描述符0、1、2, 依次表示stdin,stdout,stderr。
程序使用者可通过
<、>重定向程序的I/O。
prog < 输入文件名
prog > 输出文件名
C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括缓冲区和文件描述符。而文件描述符是文件描述符表的一个索引,也就是说c语言的文件指针是Linux系统中对文件描述符的一种封装。

二、低级I/O —— read和write
- 输入和输出时通过read和write系统调用实现的。
int n_read = read(int fd, char* buf, int n);
int n_written = write(int fd, char* buf, int n);
第一个参数是文件描述符,第二个参数是存放或读写的数据字符数组,第三个参数是要传输的字节数。
- 系统调用的函数原型都放在 syscalls.h 中。
三、open、creat、close和unlink
除了默认的stdin、 stdout、 stderr,其它文件都必须在读或写之前显式地打开。系统调用open、creat用于实现该功能。
open 用于返回一个文件描述符。
creat 用于创建一个文件,创建成功将返回一个文件描述符。
unlink将文件从文件系统中删除,对应于标准库函数remove。
实现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
long lseek(int fd, long offset, int origin)
offset是相当于origin指定位置的偏移。
origin为0、1、2用于指定offset从文件开始、从当前位置或从文件结束处开始算起。
- 写操作找到文件的末尾
lseek(fd, 0L, 2);
- 文件的开始处
lseek(fd, 0L, 0);
c程序设计语言 by K&R(五)UNIX系统接口的更多相关文章
- C程序设计语言(K&R) 笔记2
(1) #include <stdio.h> main(){ int c; while((c = getchar()) != EOF){ putchar(c); } } 注意,因为 != ...
- C程序设计语言(K&R) 笔记1
当作复习... (1)将华氏度 换算成 摄氏度,公式: ℃=(5/9)(̧°F-32) #include <stdio.h> int transformTemprature(int F){ ...
- UNIX系统接口
UNIX系统接口 8.1 文件描述符 UNIX操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统中的文件.系统通过文件描述符来标识文件:标准输入为0,标准输出为1,标准错误为2. 当程序 ...
- [C程序设计语言]第五部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 《C程序设计语言》【PDF】下载链接:
<C程序设计语言>[PDF]下载 https://u253469.pipipan.com/fs/253469-230382180 内容简介 在计算机发展的历史上,没有哪一种程序设计语言像C ...
- C语言学习书籍推荐《C程序设计语言(第2版•新版)》下载
克尼汉 (作者), 等 (作者, 译者), 徐宝文 (译者) 下载地址:点我 <C程序设计语言(第2版•新版)>是由C语言的设计者Brian W.Kernighan和Dennis M.Ri ...
- C程序设计语言(2)文摘
第一章 导言 1.1 入门 1.2 变量与算术表达式 1.3 for语句 1.4 符号常量 1.5 字符输入输出 #include "stdafx.h" main(int argc ...
- 《C程序设计语言》(K&R)中文高清非扫描件
<C程序设计语言>(K&R)中文高清非扫描件(带书签目录) 对于某下载东西都要C币的网站无爱了.好不容易找了一个,发出来看会不会帮到别人 附上addr:https://pan. ...
- K&R《C语言》书中的一个Bug
最近在重温K&R的C语言圣经,第二章中的练习题2-2引起了我的注意. 原题是: Write a loop equivalent to the for loop above without us ...
- 【R语言系列】R语言初识及安装
一.R是什么 R语言是由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman两个人共同发明. 其词法和语法分别源自Schema和S语言. R定义:一个能够自由幼小的用于统计计算和绘 ...
随机推荐
- v-model 的原理?
我们在 vue 项目中主要使用 v-model 指令在表单 input.textarea.select 等元素上创建双向数据绑定,我们知道 v-model 本质上不过是语法糖,v-model 在内部为 ...
- yb课堂 前端项目技术组件概述 《三十》
常用的技术组件的作用 学前必备基础:HTML.CSS.JavaScript.Vue基础知识 Vue:用于构建用户界面的渐进式JavaScript框架 什么是Cube-UI 基于Vue.js实现的精致移 ...
- yb课堂实战之订单和播放记录事务控制 《十六》
开启事务控制 启动类:@EnableTransactionManagement 业务类,或者业务方法@Transactional 默认事务的隔离级别和传播属性 启动类上加注解 Service层加注解
- Kafka消费端抛出异常Offset commit cannot be completed since the consumer is not part of an active group for auto partition assignment; it is likely that the consumer was kicked out of the group的解决方案
总结/朱季谦 在一次测试Kafka通过consumer.subscribe()指定偏移量Offset消费过程中,因为设置参数不当,出现了一个异常提示-- [2024-01-04 16:06:32.55 ...
- nuxt3正确使用keepalive页面缓存组件缓存
最近使用nuxt@3.x版本做SEO优化项目比较多,之前也踩坑过,所以记录一下在 nuxt3 中路由缓存的正确使用方法,本人也之前在GitHub社区中提交过反馈问题,最后是在 3.8.2 版本解决了路 ...
- 使用post请求登陆
1.使用post请求登陆 import requests import matplotlib.pyplot as plt url = 'https://www.ptpress.com.cn/login ...
- Java-Response对象设置响应消息
功能:设置响应消息 1.设置响应行 格式:HTTP/1.1 200 OK 设置状态码:setStatus(int sc) 2.设置响应头:setHeader(String name,String va ...
- Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 useHead 函数概述 useHead是一个用于在 Nuxt 应用中自定义页面头部属性的函数.它由Unhead库提供支持,允许开发者以编 ...
- 回顾 JavaScript
回顾 JavaScript 阅读前建议了解 ECMAScript 是什么? 不然你可能会疑惑下面内容 JavaScript 中掺杂的 ECMAScript 需要大体了解过 JavaScript 主要是 ...
- 字符—字符与整数的关系&&常用的库函数_C
// Code file created by C Code Develop #include "ccd.h" #include "stdio.h" #incl ...