主要内容:文件输入/输出的系统调用。

在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系统编程(一)的更多相关文章

  1. 《Linux/Unix系统编程手册》读书笔记 目录

    <Linux/Unix系统编程手册>读书笔记1  (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2  (创建于4月9日,最后更新4月10日) ...

  2. 《Linux/Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

  3. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  4. 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

  5. 《Linux/Unix系统编程手册》读书笔记6

    <Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...

  6. 《Linux/Unix系统编程手册》读书笔记5

    <Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...

  7. 《Linux/Unix系统编程手册》读书笔记4

    <Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过mallo ...

  8. 《Linux/Unix系统编程手册》读书笔记3

    <Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此 ...

  9. 《Linux/Unix系统编程手册》读书笔记1

    <Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...

  10. 《Linux/Unix系统编程手册》读书笔记2

    <Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...

随机推荐

  1. 同步和异步 阻塞和非阻塞 IO多路复用和select总结

    同步和异步的概念 同步是指用户线程发起IO请求后,需要等待或者轮询内核IO操作完成后才能继续执行: 异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程或者调用用户线程注册的回 ...

  2. Geeks - Check whether a given graph is Bipartite or not 二分图检查

    检查一个图是否是二分图的算法 使用的是宽度搜索: 1 初始化一个颜色记录数组 2 利用queue宽度遍历图 3 从随意源点出发.染色0. 或1 4 遍历这点的邻接点.假设没有染色就染色与这个源点相反的 ...

  3. EffectiveJava(28)怎么利用有限制的通配符类型来提升API的灵活性

    有时候,我们需要的灵活性要比不可变类型所能提供的更多.所以针对一些通用性的方法,通常用泛型代替固定的数据类型,特别是当你要将某个方法打包成Jar的时候. 结合之前的例子,我们增加尝试用有限制的通配符类 ...

  4. activemq两种实现方式

    第一种:点对点 #发布者public class Producer { private static final String userName = ActiveMQXAConnectionFacto ...

  5. 什么是Cookie。Cookie的原理介绍,Cookie的简单应用

    1 介绍:Cookies亦称Cookie .Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术.Cookies是当你浏览某网站时,由Web服务 ...

  6. mac os中的一些快捷键使用及基础软件安装

    mac os中terminal标签页的切换 Command+Shift+{} { 切换到左边的标签页 }  切换到右边的标签页 普通键盘对应于mac下的按键: CTRL->CONTROL WIN ...

  7. 阻塞与非阻塞、同步与异步、I/O模型

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步: 所谓同步,就是在c端 ...

  8. axios [æk'si:əʊs] 及 axios 请求配置

    特征 比Jquery轻量,但处理请求不多的时候,可以使用 基于Promise语法标准 支持nodejs 自动转换JSON数据 用法 get // Make a request for a user w ...

  9. mui 监听app运行状态

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. kvm 虚拟化 SMP(对称多处理器)介绍及配置

    一.SMP(对称多处理器)介绍 1)SMP简介 在计算机技术很普及和日益发达的今天,以 Intel.IBM 为代表的一些大公司推动着中央处理器(CPU)技术的飞速发展和更新换代.在如今计算机系统中,多 ...