文件描述符

Shell 输入/输出重定向

左心房为你撑大大i 提交于 2020-03-16 08:05:01
大多数UNIX系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取 输入。 重定向命令列表如下: 命令 说明 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). 输出重定向 重定向一般通过在命令间插入特定的符号来实现,特别的,这些符号的语法如下所示: command > file1 上面这个命令执行command1然后将输出的内容存入file1. 注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符. 实例 执行下面的who命令,他将命令的完整的输出重定向在用户文件中(users): $ who > users 执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。

Netty源码—一、server启动(1)

淺唱寂寞╮ 提交于 2020-03-16 05:26:12
说明:netty源码系列是基于4.1.25版本的netty源码的 Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo、RocketMQ。可以说Netty是对Java NIO的封装,比如ByteBuf、channel等的封装让网络编程更简单。 在介绍Netty服务器启动之前需要简单了解两件事: reactor线程模型 linux中的IO多路复用 reactor线程模型 关于reactor线程模型请参考 这篇文章 ,通过不同的配置Netty可以实现对应的三种reactor线程模型 reactor单线程模型 reactor多线程模型 reactor主从多线程模型 // reactor单线程模型,accept、connect、read、write都在一个线程中执行 EventLoopGroup group = new NioEventLoopGroup(1); bootStrap.group(group); // reactor多线程,accept在bossGroup中的一个线程执行,IO操作在workerGroup中的线程执行 EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new

基本C语言的HELLO/HI聊天程序

风格不统一 提交于 2020-03-14 11:00:02
什么是 socket? socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 我们把插头插到插座上就能从电网获得电力供应,同样,为了与远程计算机进行数据传输,需要连接到因特网,而 socket 就是用来连接到因特网的工具。 socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。 学习 socket,也就是学习计算机之间如何通信,并编写出实用的程序。 UNIX/ Linux 中的 socket 是什么? 在 UNIX/Linux 系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。 你也许听很多高手说过,UNIX/Linux 中的一切都是文件!那个家伙说的没错。 为了表示和区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。例如: 通常用 0 来表示标准输入文件(stdin)

linux----文件I/O

半世苍凉 提交于 2020-03-10 13:40:13
1. 文件描述符   一个非负整数,当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。   每个文件打开时会在内核中建立一个文件表项,这个文件表项包括文件的状态信息、存储文件内容的缓冲区、当前文件的读写位置等,这些文件表项保存在内核的一个数组(文件表)里。   每个进程在内核中有一个整形数组,里面的元素就是文件表的下标,通过这个下标可引用打开的文件表项,这个下标就是文件描述符   文件描述符0或符号常量STDIN_FILENO与进程的标准输入关联,1或符号常量STDOUT_FILENO与标准输出关联,2或STDERR_FILENO与标准错误关联(unistd.h) 2. 文件I/O操作   open打开、close关闭、lseek定位、read读、write写 2.1 文件打开 (1)open   成功,返回一个可用的最小文件描述符数值;出错返回-1 flags参数: 这3个选项互斥,只能选一个且必须有一个 可通过 | 连接使用多个选项 mode_t mode参数:   当要打开的文件不存在,且需要在创建时才有用,参数代表文件的权限 并受 umask 文件权限掩码的影响 (2)openat      dirfd参数:     ①若path指定了绝对路径,则dirfd参数无用,openat等同于open     ②path为相对路径

linux中/etc/security/limits.conf配置文件说明

旧巷老猫 提交于 2020-03-10 06:41:58
linux资源限制配置文件是/etc/security/limits.conf;限制用户进程的数量对于linux系统的稳定性非常重要。 limits.conf文件限制着用户可以使用的最大文件数,最大线程,最大内存等资源使用量。 limits.conf的格式如下: username|@groupname type resource limit username|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。 type: soft,hard 和 - soft 指的是当前系统生效的设置值。 hard 表明系统中所能设定的最大值。soft 的限制不能比har 限制高。 - 表明同时设置了 soft 和 hard 的值。 resource: core - 限制内核文件的大小 date - 最大数据大小 fsize - 最大文件大小 memlock - 最大锁定内存地址空间 nofile - 打开文件的最大数目 rss - 最大持久设置大小 stack - 最大栈大小 cpu - 以分钟为单位的最多 CPU 时间 noproc - 进程的最大数目 as - 地址空间限制 maxlogins - 此用户允许登录的最大数目 要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。查看

网络编程释疑之:TCP半开连接的处理

不问归期 提交于 2020-03-09 09:13:08
熟悉基于TCP协议进行linux高性能、高并发服务端编程的朋友肯定应该知道每个文件描述符及其所占的资源对并发量的影响。在这种7*24甚至*365不间断运行的服务器上,一个描述符被浪费,两个被浪费...如果被浪费的多了,那还何谈高并发,高性能。除去文件描述被正常占用的情况外,是什么导致了我们可用的文件描述符越来越少呢? 什么是半开连接? 当客户端与服务器建立起正常的TCP连接后,如果客户主机掉线(网线断开)、电源掉电、或系统崩溃,服务器进程将永远不会知道(通过我们常用的select,epoll监测不到断开或错误事件),如果不主动处理或重启系统的话对于服务端来说会一直维持着这个连接,任凭服务端进程如何望穿秋水,也永远再等不到客户端的任何回应。这种情况就是半开连接,浪费了服务器端可用的文件描述符。 如何处理? 熟悉套接字通用选项的朋友一定已经有了想法。TCP套接字不是有个保持存活选项SO_KEEPALIVE嘛,如果在两个小时之内在该套接字的任何一个方向上都没数据交换,TCP就自动给对端发送一个保持存活探测分节,如果此TCP探测分节的响应为RST,说明对端已经崩溃且已经重新启动,该套接字的待处理错误被置为ECONNRESET,套接字本身则被关闭。如果没有对此TCP探测分节的任何响应,该套接字的处理错误就被置为ETIMEOUT,套接字本身则被关闭。 确实

守护进程的编写

柔情痞子 提交于 2020-03-08 14:14:05
目录 守护进程的编写 一,普通进程 二,守护进程 守护进程的编写 ps: 参考资料: linux C++通讯架构实战 卷1 一,普通进程 查看进程 ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -E 'bash|PID|nginx' 这种进程都有各自对应的终端,终端退出,该进程也就退出,它的父进程是一个bash 终端被占用,你输入命令没有作用 如果放到后台(bg), 输入命令有用了,但是终端关闭进程仍然会退出 二,守护进程 定义:一种长期在后台运行的进程,不与任何终端关联 Linux本身是有很多守护进程默默运行着。查看 ps -efj 。 ppid = 0 内核进程,跟随系统,生命周期贯穿这个系统。 cmd 带 [ ] 的是内核守护进程 老祖init,也是系统守护进程,它负责启动各运行层次特定的系统服务;所以很多进程的PPID是init。而且这个init也负责收养孤儿进程; cmd列中名字不带[]的普通守护进程(用户级守护进程) 共同特点 大多数守护进程都是以超级 用户特权运行的; 守护进程没有控制终端,TT这列显示? 内核守护进程以无控制终端方式启动 普通守护进程可能是守护进程调用了setsid的结果(无控制端); 编写规则 调用umask(0); umask是个函数,用来限制(屏蔽)一些文件权限的。 fork()一个子进程

编写一个守护进程

亡梦爱人 提交于 2020-03-08 12:48:00
 编写守护进程程序时需遵循一些基本规则,以防止产生不必要的交互作用,下面先说明这些规则,然后给出一个按照这些规则编写的函数deamonize.   (1)首先,调用umask将文件创建屏蔽字设置为一个已知值(通常为0)。   (2)调用fork,然后是父进程exit。   (3)调用setsid创建一个新会话。   (4)将当前工作目录更改为根目录。   (5)关闭不需要的文件描述符。   (6)将文件描述符0,1,2指向 /dev/null   以下是一个记录日志的守护进程。 1 #include "apue.h" //详解见另一片文章 2 #include <syslog.h> 3 #include <fcntl.h> 4 #include <sys/resource.h> 5 6 void deamonze(const char *cmd) 7 { 8 int i,fd0,fd1,fd2; 9 pid_t pid; 10 struct rlimit rl; 11 struct sigaction sa; 12 13 //1、调用umask将文件模式创建屏蔽字设置为一个已知值(通常为0) 14 umask(0); 15 if(getrlimit(RLIMIT_NOFILE,&rl)<0) //获取文件描述符的数量 16 err_quit("%s:can't get file

第12 章 显示数据

落爺英雄遲暮 提交于 2020-03-08 07:05:08
12.1 了解输入和输出 12.1.1 标准文件描述符 linux 使用文件描述符,标识每个文件对象 STDOUT 和 STDERR STDERR 时shell 发送 错误消息的 目的地,默认情况下 STDERR 和 STDOUT文件描述符 指向相同的位置,即显示器。重定向 STDOUT 不会自动重定向 STDERR 12.1.2 重定向错误 ls -al badfile 2> test4 文件重定向符必须位于 > 前 ls -al test1 test2 test3 2>test5 (文件test1 test2 存在)屏幕会显示1 ,2 信息 ,test3的错误信息 会重定向到test5 2. 重定向错误和数据 如果需要重定向 错误 和 输出, 需要两个 文件重定向符 ls -al test1 test2 test3 2>test5 1>test6 1> 重定向 STDOUT 2> 重定向STDERR 也可以将 STDOUT 和 STDERR 重定向 到一个文件 (&) ls -al test1 test2 test3 &> test5 12.2 在脚本中重定向输出 12.2.1 临时重定向 如果想故意在脚本中生成错误消息,可以将单个输出行重定向到 STDERR ,需要做的只是使用 输出重定向 符号,将 输出 重定向到 STDERR文件描述,还必须在文件描述符前面添加& echo

Rabbitmq之Socket descriptors

拜拜、爱过 提交于 2020-03-07 19:02:39
rabbitmq最大连接数(Socket Descriptors), RabbitMQ的socket连接数(socket descriptors)是文件描述符(file descriptors,fd)的一个子集 。 也就是说, RabbitMQ能同时打开的最大连接数和最大文件句柄数(文件系统,管道)都是受限于操作系统关于文件描述符数量的设置,两者是此消彼长的关系。 初始时,可用socket描述符与可用fd数量的比率大概在0.8-0.9左右,这个值并不固定,当socket描述符有剩余时, RabbitMQ会使用尽量多的文件描述符用于磁盘文件读写。随着服务器建立越来越多的socket连接,文件句柄开始回收,数量减少。 总之,RabbitMQ会优先将文件描述符用于建立socket连接,宁可牺牲频繁打开/关闭文件带来的磁盘操作性能损耗, 这种取舍很容易理解,作为网络服务器,当然优先保障网络吞吐率了。因此,对于高并发连接数的多队列读写时,队列性能会稍微差那么一点,比如用RabbitMQ做RPC。 当服务器建立的socket连接已经达到限制(sockets_limit)时,服务器不再接受新连接。这里要区分清楚,RabbitMQ不再接收的是AMQP连接,而不是传输层的TCP连接, 参考链接: https://blog.csdn.net/huoyunshen88/article/details