Unix系统编程(一)
主要内容:文件输入/输出的系统调用。
在Linux中,万事万物皆文件。
文件描述符的概念
通用I/O模型的系统调用:
打开文件 open
关闭文件 close
向文件写数据 write
从文件读数据 read
这些系统调用不仅可以对普通的文件类型进行操作,也可以对管道、终端等所有类型的文件施以输入/输入操作。
所有执行I/O操作的系统调用都以文件描述符,一个非负整数(通常是小整数),来指代打开的文件。
用文件描述符表示所有类型的已打开文件,包括管道(pipe)、FIFO、socket、终端、设备和普通文件。(至今只操作过普通文件,其他几个类型还没接触过)
针对每个进程,文件描述符都自成一套。(没看懂)
3个标准的文件描述符
当在shell中操作的时候,有3个文件描述符始终是打开的。
在交互式的shell中,这个3个文件描述符通常指向shell运行所在的终端。(就是我们远程连接时候的屏幕?)
如果命令行制定对输入/输出进行重定向操作,那么shell会对文件描述符做适当修改,然后再启动程序。
文件描述符 用途 POSIX名称 stdio流
0 标准描述符 STDIN_FILENO stdin
1 标准输出 STDOUT_FILENO stdout
2 标准错误 STDERR_FILENO stderr
这里的意思是虽然shell开始会用0,1,2来这三个文件描述符代替标准输入,标准输入和标准错误,但是这种操作就像是给变量赋初始值一样。这些文件描述符并没有绑死,而是可以用freopen系统调用指向其他的任何文件对象。
fd = open(pathname, flags, mode)
打开pathname所标识的文件,并返回文件描述符,这个文件描述符就代表了打开的文件,并且在函数调用中用这个描述符就好了。
如果要打开的文件不存在,open()函数可以创建它,但是这取决于flags中的选项。
flags还指定了文件的打开方式:只读、只写或者是读写方式。
mode指定了由open()调用创建文件的访问权限(u,o,g,w, x,r),如果open()函数并没有创建文件,那么可以忽略或省略mode参数。
马丹,这块不熟,一个系统调用涉及到的东西这么多。
numread = read(fd, buffer, count)
从fd所指代的文件读取至多count字节的数据,并存储到buffer中。read()调用的返回值为实际读取到的字节数。如果再无字节可读(例如:读到文件结尾符EOF时),则返回0。
numwrite = write(fd, buffer, count)
从buffer中读取多达count字节的数据写入由fd指代的已打开文件中,write()调用的返回值为实际写入文件中的字节数,且有可能小于count。
status = close(fd)
在所有的输入/输出操作完成以后,调用close(),释放文件描述符fd以及与之相关的内核资源。
例子:用通用I/O系统调用实现一个简版的cp命令
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h> int main(int argc, char **argv) {
int fd1, fd2, count=;
char bufs[]; if(argc < ) {
printf("Usage is error: ./mycp argv1 argv2.\n");
return -;
} fd1 = open(argv[], O_RDONLY, );
if(fd1 < ) {
printf("open %s error\n", argv[]);
return -;
} fd2 = open(argv[], O_RDWR|O_CREAT, );
if(fd2 < ) {
printf("open %s error\n", argv[]);
return -;
} while( (count = read(fd1, bufs, )) > ) {
write(fd2, bufs, count);
}
close(fd1);
close(fd2);
}
然后,顺手写了一个简单的Makefile,因为这几天在看make。
# this is my Makefile for mycp
mycp: mycp.o
cc -o mycp mycp.o
mycp.o: cp.c
cc -c cp.c -o mycp.o .PHONY: clean
clean:
-rm mycp mycp.o
好像代码插件没有Makefile,那就先用bash的风格吧
Unix系统编程(一)的更多相关文章
- 《Linux/Unix系统编程手册》读书笔记 目录
<Linux/Unix系统编程手册>读书笔记1 (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2 (创建于4月9日,最后更新4月10日) ...
- 《Linux/Unix系统编程手册》读书笔记9(文件属性)
<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...
- 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)
<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...
- 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)
<Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...
- 《Linux/Unix系统编程手册》读书笔记6
<Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...
- 《Linux/Unix系统编程手册》读书笔记5
<Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...
- 《Linux/Unix系统编程手册》读书笔记4
<Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过mallo ...
- 《Linux/Unix系统编程手册》读书笔记3
<Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此 ...
- 《Linux/Unix系统编程手册》读书笔记1
<Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...
- 《Linux/Unix系统编程手册》读书笔记2
<Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...
随机推荐
- springmvc怎么重定向,从一个controller跳到另一个controller
第一种情况,不带参数跳转: 方法一:使用ModelAndView return new ModelAndView("redirect:/toList"); 这样可以重定向到toL ...
- a<<=n
a<<=n等价于a=a<<na<<n表示a左移n位(二进制)等价于a乘以2的n次方 a<<=n的含义就是,a等于a乘以2的n次方
- promise对象解决回调地狱
先放一张图片感受一下回调地狱 看起来是真的很让人头痛的东西 而现在我这里使用promise对象来解决回调地狱 采用链式的 then,可以指定一组按照次序调用的回调函数. 这时,前一个 then 里的一 ...
- android开发笔记之Volley (1)
1. volley的简介 Volley is an HTTP library that makes networking for Android apps easier and most import ...
- Python函数:使用谷歌翻译翻译英语字符串
代码是同事写的,我把它单独抠出来,可以作为工具函数使用.当然,性能还是个问题,有待解决. import random import cookielib import urllib import url ...
- 有些类库(node.js版)
做项目经常会用到好些类库,大的还好说,用的多了自然记住了名字.如express. 但也有些小而精湛的类库,不仅提供了良好的功能,本身的实现也值得研究.暂记于此. 1.web类 request 简 ...
- 解决ios7.0 以后自己定义导航栏左边button靠右的问题
1.自己定义button //左button UIButton *leftBtn = [[UIButton , , , )]; [leftBtn addTarget:self action:@sele ...
- 算法笔记_083:蓝桥杯练习 合并石子(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子 ...
- Odoo8.0安装wkhtmltopdf报表运行环境
#下载 #注意根据操作系统选择相应版本 (旧地址)wget http://sourceforge.net/projects/wkhtmltopdf/files/0.12.1/wkhtmltox ...
- [XCode A] - 编程相关问题
1.如何在XCode中新建文件夹 如果在xcode工程中new group,只是在视觉效果上分好了几个文件夹,方便分类管理,但在finder中并不会创建新的文件夹,在硬盘目录还是所有文件都并列在一个文 ...