文件描述符

linux中epoll模型

可紊 提交于 2019-12-24 01:06:21
epoll是linux内核为处理大批量文件描述符而作了改进的poll,是linux下IO复用select/poll的增强版本。 一、epoll的主要接口是: 1、创建 (1)int epoll_create(int maxfds); maxfds是支持的最大句柄数。该函数会返回一个新的epoll句柄,之后的函数调用都用这个句柄来操作。用完之后,记得用close()关闭这个创建出来的epoll句柄,否则可能导致系统fd被耗尽。 (2)int epoll_reate1(int flag); 上面创建的方法在linux 2.6.8之后,maxfds是被忽略的,所以建议采用epoll_create1(0)这种方法。另外epoll_create1(EPOLLCLOEXEC)表示生成的epoll fd具有“执行后关闭”的特性。 2、事件注册 int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event); epoll的事件注册函数,它不同于select/poll在监听的时候告诉内核要监听什么事件,而是先注册要监听的事件类型。 (1)epfd为(1)返回的epoll句柄 (2)op表示动作,用三个宏来表示: EPOLL_CTL_ADD:注册新的fd到epfd中 EPOLL_CTL_MOD:修改已注册的fd的监听事件 EPOLL

高并发情况下可能需要对数据库做的配置

ぐ巨炮叔叔 提交于 2019-12-23 20:54:02
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、最大连接数 mysql最大连接数默认151,其中150用来给普通用户连接数据库,其中一个用来给管理员救火,查看当前数据库最大连接数用: show variables like "max_connections"; 查看当前实际连接数: show processlist ; MySQL最大连接数是16384,超过这个数也是按这个数计算, 修改最大连接数: set global max_connections=12000 2、操作系统最大文件描述符限制 服务器(centos)默认操作系统最大文件描述符限制为1024,当并发量较大时,可能会得不到线程导致无法访问,当前最大文件描述符限制可以通过一下命令查看: [root@sqzr ~]# ulimit -n 如果较小,可以修改增加性能 来源: oschina 链接: https://my.oschina.net/u/3042999/blog/1648789

Linux后台执行脚本文件,nohup

风格不统一 提交于 2019-12-23 16:00:18
看运维人员执行nohup命令后,把程序放在后台执行,很高大上,就研究了一下,这个命令. nohup命令及其输出文件 nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。 该命令的一般形式为:nohup command &   使用nohup命令提交作业   如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:    nohup command > myout.file 2>&1 &   在上面的例子中,输出被重定向到myout.file文件中。   使用 jobs 查看任务。 例子: nohup php activity_insert_user.php 61 26_02.txt > 26_02.log 2>&1 & 注意事项: 2>&1 是一个整体,中间没有空格,表示把标准输出和错误输出都传到指定文件中. 下面是详解: ls xxx 1>out.txt 2>&1 nohup /mnt/Nand3/H2000G >/ dev / null 2>&1 & 对 于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT

Linux网络通信

孤街醉人 提交于 2019-12-23 03:45:23
使用TCP协议的socket 1.网络字节序 由于在主机存储为小端序,网络传输为大端序,并且在网络中需要读取IP号和端口号,所以发送端要将小端序转为大端序,接收端将大端序转为小端序 #include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); 表示host,n表示network,l表示32位长整数,s表示16位短整数。 2. IP地址转换函数 #include <arpa/inet.h> int inet_pton(int af, const char *src, void *dst); const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); 3.构造一个sockaddr struct sockaddr_in servaddr; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl

27 Server Sockets

大城市里の小女人 提交于 2019-12-23 00:55:21
1 Client Socket Programming (Review) 2 Server Sockets 2.1 Binding a Socket: bind() 1. int bind(int socket, const struct sockaddr *address, socklen_t address_len); 2.2 Queuing incoming connections: listen() int listen(int socket, int backlog); backlog是指listen等待的 connect 的个数, accept 会减少listen等待的个数,如果多于这个个数则拒绝 2.3 Accepting Incoming Connections: accept() 1. int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len); 2. accept返回一个文件描述符 3. server socket的文件描述符仍然存在,这样就可以接受更多的连接 4. accept 的文件描述符和 server socket 的文件描述符不相同 5. accept 会开启新的端口,而 server socket 则需要保证端口不变来接收新的连接

epoll

十年热恋 提交于 2019-12-22 08:33:38
本质上 epoll 还是一种 I/O 多路复用技术, epoll 通过监控注册的多个描述字,来进行 I/O 事件的分发处理。不同于 poll 的是,epoll 不仅提供了默认的 level-triggered(条件触发)机制,还提供了性能更为强劲的 edge-triggered(边缘触发)机制。 epoll使用 epoll_create epoll_create() 方法创建了一个 epoll 实例, int epoll_create ( int size ) ; int epoll_create ( int flags ) ; 若成功返回大于 0 的值, - 1 表示出错 参数 size 被自动忽略,但是该值仍需要一个大于 0 的整数,关于参数 size,在一开始的 epoll_create 实现中,是用来告知内核期望监控的文件描述字大小,然后内核使用这部分的信息来初始化内核数据结构,在新的实现中,这个参数不再被需要,因为内核可以动态分配需要的内核数据结构。我们只需要注意,每次将 size 设置成一个大于 0 的整数就可以了。 epoll_create1() 的用法和 epoll_create() 基本一致,如果 epoll_create1() 的输入 flags 为 0,则和 epoll_create() 一样,内核自动忽略。可以增加如 EPOLL_CLOEXEC 的额外选项。

unix环境高级编程-标准IO

痴心易碎 提交于 2019-12-22 07:11:47
标准IO库: 不仅在unix上,在很多操作系统上都实现了标准的IO库,它处理了很多细节,例如缓冲区分配,优化长度执行IO等。 流和FILE对象: 对于标准的IO库,它们的操作是围绕流(stream)进行的。当用标准IO库打开或创建一个文件时,已经使一个流和一个文件相关联,标准的io文件流可用于单字节和多字节字符集,流的定向决定了所读。所写的字符是单字节还是多字节的,当一个流最初被创建,并没有定向,若在一个未定向的流上使用一个多字节IO函数,则将该流的定向设置为宽定向,若在未定向的流上使用单字节IO函数,则流定向为字节定向的。只有两个函数能够改变流的定向,freopen清除一个流的定向,fwide函数设置流的定向。 当打开一个流时,标准IO函数fopen返回一个指向FILE对象的指针,该对象通常是一个结构,包含了标准IO库为管理该流需要的所有信息,包括用于实际IO文件描述符、指向用于该缓冲区的指针、缓冲区的长度、当前在缓冲区的字符数等。 应用程序没有必要检验FILE对象,为了引用一个流,需将FILE指针作为参数传递给每个标准IO函数,称指向FILE对象的指针为文件指针。 标准输入,标准输出和标准出错: 对一个进程预定义了三个流,可以自动被进程使用,,这三个标准io流通过预定义文件指针stdin,stdout和stderr加以引用,这三个指针同样定义在头文件<stdio.h>中。 缓冲

python之文件

可紊 提交于 2019-12-22 05:03:00
文件打开函数: f = open 表1-1:open函数中模式参数常用值 打开模式 描述 ‘r’ 读模式 ‘w’ 写模式 ‘a’ 追加模式 ‘b’ 二进制模式 ‘+‘ 读/写模式 表1-2:文件对象方法 文件对象方法 执行操作 f.close() 关闭文件 f.read(size = -1) 从文件中读取size个字符,当未给定size或给定负值的时候,读取剩余的所有字符,然后作为字符串返回 f.readline() 以写入模式打开,如果文件存在,则在末尾追加写入 f.write(str) 将字符串str写入文件 f.writelines(seq) 向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象 f.seek(offset,from) 在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节 f.tell() 返回当前在文件中的位置 文件读写操作: 1 #!/usr/bin/python2 2 # -*- coding: utf-8 -*- 3 4 def save_file(boy,girl,count): 5 file_name_boy = '/home/wei/wei/test/' + 'boy_' + str(count) + '.txt' 6 file_name_girl = '/home/wei

linux timerfd系列函数总结

不想你离开。 提交于 2019-12-21 08:46:07
网上关于timerfd的文章很多,在这儿归纳总结一下方便以后使用,顺便贴出一个timerfd配合epoll使用的简单例子 一、timerfd系列函数   timerfd是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,因此可以配合select/poll/epoll等使用。 下面对timerfd系列函数先做一个简单的介绍: (1)timerfd_create()函数 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); /* timerfd_create()函数创建一个定时器对象,同时返回一个与之关联的文件描述符。 clockid:clockid标识指定的时钟计数器,可选值(CLOCK_REALTIME、CLOCK_MONOTONIC。。。) CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户改成其他,则对应的时间相应改变 CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响 flags:参数flags(TFD_NONBLOCK(非阻塞模式)/TFD_CLOEXEC(表示当程序执行exec函数时本fd将被系统自动关闭

标准输出和标准错误输出

南笙酒味 提交于 2019-12-20 09:28:47
相关概念 默认情况下,总是有三个文件处于打开状态 1. 标准输入(键盘输入) 对应文件描述符0 2. 标准输出(输出到屏幕) 对应文件描述符1 3. 标准错误(也是输出到屏幕) 对应文件描述符2 常用方法 >/dev/null 2>&1 实际上,应该等同于这样:1 > /dev/null 2 > /dev/null ,默认情况下就是1,标准输出,所以一般都省略。 而&号,后面接的是必须的文件描述符。 不能写成2>1,这样就成了标准错误重定向到文件名为1的文件中了,而不是重定向标准错误到标准输出中。 所以这里就是:标准输出重定向到了/dev/null,而标准错误又重定向到了标准输出, 所以就成了标准输出和标准错误都重定向到了/dev/null 2>&1 >/dev/null 事实上, 命令行的重定向什么的, 是在执行命令之前就准备好了的。 解释顺序从左至右依次进行, 2>&1 ,而1是屏幕, 所以标准错误重定向到屏幕, 再而 1>/dev/null , 即标准输出重定向到 /dev/null, 上述2>&1 >/dev/null 并不是什么同一时刻要么产生标准输出要么产生标准错误. 而是两个不同的东西. 用以下变量的方式做个解释,就很明显了,这两种方式是不同的,前者就像: a=1 b=a 而后者就像: b=a a=1 &>/dev/null # 这个就是,不管你是啥玩意儿文件描述符