文件描述符

进程间通信 IPC interprocess communication

做~自己de王妃 提交于 2019-12-06 03:47:21
1,管道,FIFO 2, 信号 3,消息队列 4,共享类存 5.文件映射 6.socket ( 1 )管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。   ( 2 )命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。   ( 3 )信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。   ( 4 )消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺   ( 5 )共享内存:使得多个进程可以访问同一块内存空间

文件指针与文件描述符

本小妞迷上赌 提交于 2019-12-06 03:18:39
目录 文件指针与文件描述符 概念 缓冲 title: 文件指针与文件描述符 date: 2019/11/28 20:01:12 toc: true --- 文件指针与文件描述符 概念 文件描述符是针对内核的,是一个非负的整数,每个进程的描述符是独立的,标准输入输出和错误是 STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO ,定义在 unistd.h ,对应的是 open 系列的函数 文件指针是 FILE * 结构指针,标准输入输出和错误对应的文件指针是 stdin,stdout,stderr ,定义在 stdio.h ,对应的是 fopen 系列的函数 缓冲 文件指针是标准IO库的具体实现,标准IO的一个最大的特色就是提供缓冲,加快速度. 全缓冲 行缓冲,默认值在 stdio.h , #define BUFSIZ 8192 无缓冲 #include <stdio.h> // 注意 如果参数没有size的,要确保缓冲长度大于 BUFSIZ 这个值定义在 stdio.h /* Default buffer size. */ #define BUFSIZ 8192 void setbuf(FILE *stream, char *buf); void setbuffer(FILE *stream, char *buf, size_t size); void

一文让你读懂懂阻塞、非阻塞、同步、异步IO

倖福魔咒の 提交于 2019-12-06 01:24:02
介绍 在谈及网络IO的时候总避不开阻塞、非阻塞、同步、异步、IO多路复用、select、poll、epoll等这几个词语。在面试的时候也会被经常问到这几个的区别。本文就来讲一下这几个词语的含义、区别以及使用方式。 Unix网络编程一书中作者给出了五种IO模型: 1、BlockingIO - 阻塞IO 2、NoneBlockingIO - 非阻塞IO 3、IO multiplexing - IO多路复用 4、signal driven IO - 信号驱动IO 5、asynchronous IO - 异步IO 这五种IO模型中前四个都是同步的IO,只有最后一个是异步IO。信号驱动IO使用的比较少,重点介绍其他几种IO以及在Java中的应用。 阻塞、非阻塞、同步、异步以及IO多路复用 在进行网络IO的时候会涉及到用户态和内核态,并且在用户态和内核态之间会发生数据交换,从这个角度来说我们可以把IO抽象成两个阶段:1、用户态等待内核态数据准备好,2、将数据从内核态拷贝到用户态。之所以会有同步、异步、阻塞和非阻塞这几种说法就是根据程序在这两个阶段的处理方式不同而产生的。 同步阻塞 当在用户态调用read操作的时候,如果这时候kernel还没有准备好数据,那么用户态会一直阻塞等待,直到有数据返回。当kernel准备好数据之后,用户态继续等待kernel把数据从内核态拷贝到用户态之后才可以使用

linux下 > /dev/null 2 > &1 的意思

寵の児 提交于 2019-12-06 00:27:20
一、几个基本符号及其含义 之前看到别人写的一个shell脚本,有一个命令是: rm -f ${src_tmp_file} > /dev/null 2>&1 现在大概明白是什么意思了 当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用 类型 文件描述符 默认情况 对应文件句柄位置 标准输入(standard input) 0 从键盘获得输入 /proc/self/fd/0 标准输出(standard output) 1 输出到屏幕(即控制台) /proc/self/fd/1 错误输出(error output) 2 输出到屏幕(即控制台) /proc/self/fd/2 /dev/null 表示空设备文件 0 表示stdin标准输入 1 表示stdout标准输出 2 表示stderr标准错误 >/dev/null 这条命令的作用是将标准输出1重定向到 /dev/null 中。 /dev/null 代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。那么执行了 >/dev/null 之后,标准输出就会不再存在,没有任何地方能够找到输出的内容。 &1 对于 &1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。 2 对于2 ,表示标准错误,stderr。 2>&1 的意思就是将标准错误重定向到标准输出

IO概念和五种IO模型

霸气de小男生 提交于 2019-12-05 22:53:47
一、什么是IO? 我们都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、不管socket、还是FIFO、管道、终端、对我们来说、一切都是文件、一切都是流、在信息交换的过程中、我们都是对这些流进行数据的收发操作、简称为I/O操作(input and output)、往流中读出数据、系统调用read、写入数据、系统调用write、不过话说回来了、计算机里有这么多的流、我怎么知道要操作哪个流呢?做到这个的就是文件描述符、即通常所说的fd、一个fd就是一个整数、所以对这个整数的操作、就是对这个文件(流)的操作、我们创建一个socket、通过系统调用会返回一个文件描述符、那么剩下对socket的操作就会转化为对这个描述符的操作、不能不说这又是一种分层和抽象的思想。 二、IO交互 通常用户进程中的一个完整IO分为两个阶段: 用户空间<------------->内核空间、 内核空间<------------->设备空间、 内核空间中存放的是内核代码和数据、而进程的用户空间中存放的是用户程序的代码和数据、不管是内核空间还是用户空间、它们都处于虚拟空间中、Linux使用两级保护机制:0级供内核使用、3级供用户程序使用、 操作系统和驱动程序运行在内核空间、应用程序运行在用户空间、两者不能简单地使用指针传递数据、因为Linux使用的虚拟内存机制

文件IO

允我心安 提交于 2019-12-05 17:56:58
目录 文件IO 文件描述符 获取最大支持的描述符 open/openat/creat close lseek off_t 类型说明 lseek与OAPPEND的区别 内核维护的文件信息 dup/dup2 FD_CLOEXEC 缓存同步到存储 fcntl改变文件属性 ioctl 文件截断 代码附录 获取最大文件描述符 使用openat来实现一种相对路径的打开 lseek测试管道等 lseek文件跨越写 fcntl获取文件状态 title: 文件IO date: 2019/11/23 10:49:52 toc: true --- 文件IO 文件描述符 文件描述符是非负的整数,一般是系统调用的,这个与 file_struct 区别开来. STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO 被定义在 <unistd.h> 获取最大支持的描述符 新的 linux 已经不支持 OPEN_MAX 来直接获取这个最大描述符了, sysconf(_SC_OPEN_MAX) shell 下这么查看,其中的 open files (-n) 1024 就是了 reallin@ubuntu:/work/pan/apue$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d)

epoll 基本知识与使用

孤者浪人 提交于 2019-12-05 16:30:39
https://blog.csdn.net/qq_35721743/article/details/86742508 epoll 最大的好处在于它不会随着监听 fd 数目的增长而降低效率。 epoll 的接口,一共有三个函数, 都在头文件 #include <sys/epoll.h> 里。 1. 创建 epoll 句柄 int epfd = epoll_create(intsize); 创建一个 epoll 句柄,size 用来告诉内核这个监听的数目一共有多大。当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看 /proc/进程id/fd/, 是能够看到这个fd的,所以在使用完epoll后,必须调用 close() 关闭。 否则可能导致 fd 被耗尽。 函数声明: int epoll_create(int size) 该函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存放你想关注的socket fd 上是否发生以及发生了什么事件。size就是你在这个epoll fd上能关注的最大socket fd 数, 由用户确定, 只要内存空间够用。 2. 将被监听的描述符添加到epoll句柄或从epoll句柄中删除或者对监听事件进行修改 函数声明:int epoll_ctl( int epfd, int op, int fd, struct

IO模式和IO多路复用

ぐ巨炮叔叔 提交于 2019-12-05 09:42:55
原文链接: https://www.cnblogs.com/zingp/p/6863170.html https://www.cnblogs.com/guxuanqing/p/10482066.html   网络编程里常听到阻塞IO、非阻塞IO、同步IO、异步IO等概念,总听别人装13不如自己下来钻研一下。不过,搞清楚这些概念之前,还得先回顾一些基础的概念。 回到顶部 1 基础知识回顾 注意: 咱们下面说的都是 Linux环境 下,跟Windows不一样哈~~~ 1.1 用户空间和内核空间   现在操作系统都采用虚拟寻址, 处理器先产生一个虚拟地址 ,通过 地址翻译成物理地址(内存的地址) ,再通过总线的传递,最后处理器拿到某个物理地址返回的字节。   对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用

Linux之恢复误删除文件

一笑奈何 提交于 2019-12-05 06:57:11
前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有 bug。 那么如果真的删除了不该删除的文件,比如数据库、日志或执行文件,该如何恢复? 模拟场景 1.删除 误删除服务器目录/root/selenium/Spider下的MySql.Data.dll文件: > rm -f /root/selenium/Spider/MySql.Data.dll > ll /root/selenium/Spider/MySql.Data.dll ls: cannot access /root/selenium/Spider/MySql.Data.dll: No such file or directory 2.恢复 (1)使用 lsof 命令查看当前是否有进程打开 /root/selenium/Spider/MySql.Data.dll文件: > lsof | grep /root/selenium/Spider/MySql.Data.dll 从上面可以看出,当前文件状态为已删除(deleted)。 (2)查看是否存在恢复数据: /proc/13067/fd:进程操作的文件描述符目录。 86:文件描述符。 > cat /proc/13067/fd/86 (3)使用I/O重定向恢复文件 > cat /proc

Linux之恢复误删除文件

感情迁移 提交于 2019-12-05 06:55:18
前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有 bug。 那么如果真的删除了不该删除的文件,比如数据库、日志或执行文件,该如何恢复? 模拟场景 1.删除 误删除服务器目录/root/selenium/Spider下的MySql.Data.dll文件: > rm -f /root/selenium/Spider/MySql.Data.dll > ll /root/selenium/Spider/MySql.Data.dll ls: cannot access /root/selenium/Spider/MySql.Data.dll: No such file or directory    2.恢复 (1)使用 lsof 命令查看当前是否有进程打开 /root/selenium/Spider/MySql.Data.dll文件: > lsof | grep /root/selenium/Spider/MySql.Data.dll 从上面可以看出,当前文件状态为已删除(deleted)。 (2)查看是否存在恢复数据: /proc/13067/fd:进程操作的文件描述符目录。 86:文件描述符。 > cat /proc/13067/fd/86 (3)使用I/O重定向恢复文件 > cat /proc