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定义:一个能够自由幼小的用于统计计算和绘 ...
随机推荐
- node.js 增删改查(原始)
index.js 连接数据库 const mongoose = require('mongoose') //数据库连接27017是mongodb数据库的默认端口 mongoose.connect(' ...
- yb课堂 开发前端项目路由 《三十五》
Vue-Router开发前端项目路由 vue-router 是Vue.js官方的路由管理器,它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌 官方文档:https://router.vue ...
- Nuxt框架中内置组件详解及使用指南(五)
title: Nuxt框架中内置组件详解及使用指南(五) date: 2024/7/10 updated: 2024/7/10 author: cmdragon excerpt: 摘要:本文详细介绍了 ...
- Nginx 可视化配置神器NginxConfig
Nginx 是前后端开发工程师必须掌握的神器.该神器有很多使用场景:比如反向代理.负载均衡.动静分离.跨域等等. 把 Nginx 下载下来打开 conf 文件夹的 nginx.conf 文件,Ngin ...
- 苹果手机使用charles抓包无法下载charles证书
苹果手机使用charles抓包无法下载charles证书的问题记录: 使用:chls.pro/ssl --------无效 使用:http://chls.pro/ssl ---- ...
- 从DDPM到DDIM
从DDPM到DDIM (一) 现在网络上关于DDPM和DDIM的讲解有很多,但无论什么样的讲解,都不如自己推到一边来的痛快.笔者希望就这篇文章,从头到尾对扩散模型做一次完整的推导. DDPM是一个双向 ...
- vscode 调试 nodejs 程序
nodejs 服务在vscode 中的调试 1.安装vscode 略(这不用说了吧) 2.写一个能跑的nodejs 程序 其实看到这个,自己已经有一个能跑的nodejs 程序,不用看我的了 我这里是我 ...
- 如何为spring配置全局抛出异常注解
0.首先了解一个注解@ControllerAdvice,他是spring里的一个注解,用于定义全局逻辑异常.数据绑定.请求处理等逻辑,与@ExceptionHandler等注解使用. Controll ...
- 【Java】Spring注入静态Bean的几种写法
单例模式在Spring注解上的一种拓展用法 写法一,先配置自身Bean,作为静态成员,然后目标Bean作为自身Bean的实例成员' Spring初始化自身Bean时自动装配数据源Bean,从而附属到静 ...
- 【SQL】 牛客网SQL训练Part3 较难难度
获取当前薪水第二多的员工的emp_no以及其对应的薪水salary 请你查找薪水排名第二多的员工编号emp_no.薪水salary.last_name以及first_name,不能使用order by ...