文件描述符

APUE学习笔记(4)-文件共享

谁都会走 提交于 2019-12-19 03:26:20
写在前面 1. 本文内容对应《 UNIX 环境高级编程》 ( 第 2 版 ) 》第 3 章。 2. 主要总结了 UNIX 系统下描述文件的三种数据结构,以及文件共享的相关概念。 3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。 文件数据结构 表示文件的数据结构有三个: l v 节点结构 ,包含 a) 文件类型 b) 对此文件进行各种操作的函数的指针 c) 文件的 i 节点(索引节点)。 i 节点包含文件的所有者,文件长度,文件所在的设备,指向文件实际数据块在磁盘上所在位置的指针等等。 Linux 没有使用 v 节点,而是使用了通用 i 节点结构。 l 文件表项 ,内核为所有打开文件维持一张文件表,每个文件表项包含 a) 文件状态标志(读,写,添加,同步和非阻塞等) b) 当前文件偏移量 c) 指向该文件 v 节点表项的指针。 l 文件描述符 ,每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是 a) 文件描述符标志( FD_CLOEXEC ,表示文件描述符在通过一个 exec 时仍保持有效) b) 指向一个文件表项的指针。 文件共享 l 共享 v 节点。对于打开同一个文件的所有进程,它们共享该文件的 v 节点结构,但是可以拥有各自的文件表项,即不同的文件状态标志和当前偏移量。 l 共享文件表项

多路IO复用技术--select模型

扶醉桌前 提交于 2019-12-18 01:56:47
1.功能介绍 1.1 网络通信中,对于套接字(文件描述符)在任意时刻是否有数据可读,我们不知道,只会用while 10毫秒循环收发,select能够解决这个问题,时时监听套接字的读写情况,有收到数据就读取。 2.相关函数说明 2.1 int select ( int n , fd_set * readfds , fd_set * writefds , fd_set * exceptfds , struct timeval * timeout ) ; 说明: select ( ) 用来等待文件描述符状态的改变。参数n代表最大的文件描述符加 1 ,参数readfds、writefds和exceptfds称为文件描述符集,填了readfd代表监听可读事件(收数据),不填代表不监听该事件,其他两个同理,timeout代表超时时间设置,就是个时间,可不设置,填 NULL , struct timeval结构体如下: struct timeval { long tv_sec ; /*秒 */ long tv_usec ; /*微秒 */ } 2.2 字符集相关函数操作 int FD_ZERO ( fd_set * fdset ) ; int FD_CLR ( int fd , fd_set * fdset ) ; int FD_SET ( int fd , fd_set * fdset ) ;

Shell(六):输入/输出重定向

*爱你&永不变心* 提交于 2019-12-17 17:02:05
重定向的作用是将命令的执行结果输出到指定的文件中。 重定向命令列表如下: 文件描述符 0 通常是标准输入(STDIN), 1 是标准输出(STDOUT), 2 是标准错误输出(STDERR)。 1、输出重定向 将输出重定向到file示例: 注意,任何file1内的已经存在的内容将被新内容替代,更改file1,再次重定向: 如果要将新内容添加在文件末尾,需要使用>>操作符: 2、输入重定向 注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。 重定向输入和输出可以同时使用: 一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件: 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。 默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。 如果希望 stderr 重定向到 file,可以这样写: $ command 2> file 如果希望 stderr 追加到 file 文件末尾

Shell标准输出、标准错误 >/dev/null 2>&1

て烟熏妆下的殇ゞ 提交于 2019-12-16 20:44:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> shell中可能经常能看到:>/dev/null 2>&1 eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print $4}'` 1>/dev/null 2>/dev/null 命令的结果可以通过%>的形式来定义输出 /dev/null 代表空设备文件 > 代表重定向到哪里,例如:echo "123" > /home/123.txt 1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null" 2 表示stderr标准错误 & 表示等同于的意思,2>&1,表示2的输出重定向等同于1 那么本文标题的语句: 1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。 2>&1 接着,标准错误输出重定向 等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。 ///////////////////// 脚本只使用标准输入、标准输出和标准错误 Shell会自动为我们打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。标准输入是命令的输入,默认指向键盘;标准输出是命令的输出,默认指向屏幕

Python3 OS 文件/目录方法

天大地大妈咪最大 提交于 2019-12-16 19:35:06
Python3 OS 文件/目录方法 os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示: 序号 方法及描述 1 os.access(path, mode) 检验权限模式 2 os.chdir(path) 改变当前工作目录 3 os.chflags(path, flags) 设置路径的标记为数字标记。 4 os.chmod(path, mode) 更改权限 5 os.chown(path, uid, gid) 更改文件所有者 6 os.chroot(path) 改变当前进程的根目录 7 os.close(fd) 关闭文件描述符 fd 8 os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 9 os.dup(fd) 复制文件描述符 fd 10 os.dup2(fd, fd2) 将一个文件描述符 fd 复制到另一个 fd2 11 os.fchdir(fd) 通过文件描述符改变当前工作目录 12 os.fchmod(fd, mode) 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 13 os.fchown(fd, uid, gid) 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定

Shell编程—呈现数据

三世轮回 提交于 2019-12-15 20:04:09
1. 标准文件描述符 Linux用文件描述符(file descriptor)来标识每个文件对象。文件描述符是一个非负整数,可以唯一标识会话中打开的文件。每个进程一次 多可以有九个文件描述符。出于特殊目的,bash shell保留了前三个文件描述符(0、1和2): 文件描述符 缩 写 描 述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1. STDIN : 代表shell的标准输入。对终端界面来说,标准输入是键盘。 2. STDOUT : STDOUT文件描述符代表shell的标准输出。在终端界面上,标准输出就是终端显示器。 3. STDERR : STDERR文件描述符处理错误消息。STDERR文件描述符代表shell的标准错误输出。 1.1 重定向错误 1. 只重定向错误 $ ls -al test badtest test2 2> test5 -rw-rw-r-- 1 rich rich 158 2014-10-16 11:32 test2 $ cat test5 ls: cannot access test: No such file or directory ls: cannot access badtest: No such file or directory 2. 重定向错误和数据 $ ls -al test test2

epoll详解

无人久伴 提交于 2019-12-14 12:03:41
什么是 epoll ? epoll是 Linux 下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集 合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符 集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的电平触发 (Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。 Linux 2.6内核中对/dev/epoll设备的访问的封装(system epoll)。 这个使我们开发网络应用程序更加简单,并且更加高效。 为什么要使用epoll? 同样,我们在linux系统下,影响效率的依然是I/O操作,linux提供给我们select/poll/epoll等多路复用I/O方式 (kqueue暂时没研究过) ,为什么我们对epoll情有独钟呢?原因如下: 1.文件描述符数量的对比。 epoll并没有fd(文件描述符)的上限,它只跟系统内存有关

Shell--输入/输出重定向

北慕城南 提交于 2019-12-14 09:05:21
Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。 重定向命令列表如下: 命令 说明 command > file 将输出重定向到 file。 command < file 将输入重定向到 file。 command >> file 将输出以追加的方式重定向到 file。 n > file 将文件描述符为 n 的文件重定向到 file。 n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。 n >& m 将输出文件 m 和 n 合并。 n <& m 将输入文件 m 和 n 合并。 << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。 输出重定向 重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示: command1 > file1 上面这个命令执行command1然后将输出的内容存入file1。 注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用

管道-pipe

▼魔方 西西 提交于 2019-12-14 02:30:39
文章目录 1、管道介绍 2、管道接口 2.1 管道的一般用法(演示原理) 2.2 管道实现通信(演示原理) 2.3 应用设计注意 3、管道应用 3.1 SHELL 的管道线 3.2 设计一个管道线支持shell 3.3 popen pclose函数 1、管道介绍 管道的设计目的是实现进程间通信,并且管道是最早的一种进程间通信方式 这种方式实现的进程间通信有一定局限性: 管道是以半双工方式工作的 参与通信的进程之间应具有父祖关系 两个进程为了实现通信,两个进程应该拥有共享的资源-----这里就是使用pipe函数创建的管道设备 父进程通过fork,子进程会继承父进程的文件描述符(也就意味着子进程和父进程可以读写同一个管道设备) 2、管道接口 管道在内核中的表示是一种管道类型的文件!它像极了普通文件那样,可以读,可以写。唯一区别在于普通文件使用一个fd文件描述符既可以读,又可以写;但是管道需要两个文件描述符,一个用于读,一个用于写 2.1 管道的一般用法(演示原理) 在一个进程中,管道像普通文件那样读写:典型的数据流如下 主进程发一个Hello pipe!给管道设备,然后主进程自己读取 #include < iostream > #include < cstring > using namespace std ; extern "C" { #include < unistd . h >

一、Linux文件操作

牧云@^-^@ 提交于 2019-12-14 01:17:28
01. 文件描述符 在 Linux 的世界里,一切设备皆文件。我们可以使用系统调用中 I/O 的函数(I:input,输入;O:output,输出),对文件进行相应的操作( open()、close()、write() 、read() 等)。 打开现存文件或新建文件时,系统(内核)会返回一个 文件描述符 ,文件描述符用来指定已打开的文件。这个文件描述符相当于这个已打开文件的标号,文件描述符是非负整数,是文件的标识,操作这个文件描述符相当于操作这个描述符所指定的文件。 程序运行起来后(每个进程)都有一张 文件描述符的表 ,标准输入、标准输出、标准错误输出设备文件被打开,对应的文件描述符 0、1、2 记录在表中。程序运行起来后这三个文件描述符是默认打开的。 #define STDIN_FILENO 0 //标准输入的文件描述符 #define STDOUT_FILENO 1 //标准输出的文件描述符 #define STDERR_FILENO 2 //标准错误的文件描述符 在程序运行起来后打开其他文件时, 系统会返回文件描述符表中最小可用的文件描述符 ,并将此文件描述符记录在表中。Linux 中一个进程最多只能打开 NR_OPEN_DEFAULT (即1024)个文件,故当文件不再使用时应及时调用 close() 函数关闭文件。 02. 常用文件IO函数 2.1 open函数