文件描述符

dup()函数

倖福魔咒の 提交于 2020-03-01 11:05:14
# include <stdio.h> # include <fcntl.h> # include <unistd.h> int main ( int argc , char * argv [ ] ) { if ( argc < 2 ) { perror ( "error" ) ; } int fd1 , fd2 ; fd1 = open ( argv [ 1 ] , O_RDWR ) ; if ( fd1 == - 1 ) { perror ( "error" ) ; } fd2 = dup ( fd1 ) ; close ( fd1 ) ; char buf [ 128 ] = { 0 } ; read ( fd2 , buf , sizeof ( buf ) ) ; printf ( "buf =%s \n" , buf ) ; close ( fd2 ) ; } dup()函数 头文件及函数定义: #include <unistd.h> int dup(int oldfd); dup用来复制参数oldfd所指的文件描述符。当复制成功是,返回最小的尚未被使用过的文件描述符,若有错误则返回-1.错误代码存入errno中返回的新文件描述符和参数oldfd指向同一个文件,这两个 描述符共享同一个数据结构,共享所有的锁定,读写指针和各项全现或标志位。 调用dup(oldfd)等效于

python基础-11 socket,IO多路复用,select伪造多线程,select读写分离。socketserver源码分析

给你一囗甜甜゛ 提交于 2020-03-01 05:34:45
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭) socket和file的区别: file模块是针对某个指定文件进行【打开】【读写】【关闭】 socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】 服务端 #!/usr/bin/env python # -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',9999) sk = socket.socket() sk.bind(ip_port) sk.listen(5) while True: print 'server waiting...' conn,addr = sk.accept()#阻塞 client_data = conn.recv(1024) print client_data conn.sendall('不要回答,不要回答,不要回答') conn.close()

Linux最大打开文件描述符数

我的未来我决定 提交于 2020-02-29 21:52:29
1. 系统最大打开文件描述符数:/proc/sys/fs/file-max   a. 查看     $ cat /proc/sys/fs/file-max     186405 2. 设置   a. 临时性     $ echo 1000000 > /proc/sys/fs/file-max   b. 永久性:在/etc/sysctl.conf中设置     fs.file-max = 1000000 2. 进程最大打开文件描述符数:user limit中nofile的soft limit   a. 查看     $ ulimit -n     170000   b. 设置     1). 临时性:       通过ulimit -Sn设置最大打开文件描述符数的soft limit,注意soft limit不能大于hard limit(ulimit -Hn可查看hard limit),另外ulimit -n默认查看的是soft limit,但是ulimit -n 180000则是同时设置soft limit和hard limit。对于非root用户只能设置比原来小的hard limit。       (1)查看hard limit:         $ ulimit -Hn         170000       (2)设置soft limit,必须小于hard limit:  

文件IO(4)

余生长醉 提交于 2020-02-29 12:19:39
文件IO open()   头文件 #include<unistd.h> int open(const char *pathname,int flags); pathname:欲打开的文件路径 flags:文件打开方式 常用参数  头文件 #include<fcntl.h> O_RDONLY、O_WRONLY、O_RDWR O_APPEND、O_CREAT、O_EXCL、O_TRUNC、O_NUNBLOCK 返回值: 成功:打开文件所得到对应的文件描述符(整数) 失败:-1,设置error int open(const char *pathname,int flags,mod_t mode); pathname:欲打开的文件路径 flags:文件打开方式 常用参数 O_RDONLY、O_WRONLY、O_RDWR o_APPEND、O_CREAT、O_EXCL、O_TRUNC、O_NUNBLOCK mode:参数3使用的前提是 参数2指定了O_CREAT,取值为八进制数,用来描述文件的访问权限。 创建文件时,指定文件访问权限。权限同时受 umask 影响。结论为:文件权限 = mode & ~umask 返回值: 成功:打开文件所得到对应的文件描述符(整数) 失败:-1,设置error open常见错误: 打开文件不存在 以写方式打开只读文件(打开文件没有对应权限)

select - I/O多路复用

[亡魂溺海] 提交于 2020-02-27 20:46:43
使用select函数的套接字 如果你想保持现有连接的同时,侦听新的连接,怎么办呢? 普通的做法(使用recv, accept是做不到的)。当使用accetp等待新的连接时,程序是阻塞的,也就没办法再同原有连接保持通信。 另一种做法是,使用非阻塞方式,但这会浪费了宝贵的CPU时间(你的不停的轮询轮询)。 有没有更好的办法呢?答案是肯定的 – 使用select函数。 select可以帮助你同时监听多个套接字。它会告诉你哪个套接字读数据就绪, 哪个套接字写数据就绪,哪个套接字发生错误。 使用select意味着使用I/O多路技术。 select函数头文件: #include <sys/time.h> #include <sys/types.h> #include <unistd.h> select函数原型: int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 详细信息可查看 man select select()函数的参数说明: numfds 是readfds,writefds,exceptfds 中fd 集合中文件描述符中最大的数字加上1。 readfds 中的fd 集合将由select 来监视是否可以读取。 writefds

并发程序设计3:多路IO复用技术(2)

你说的曾经没有我的故事 提交于 2020-02-26 13:09:08
  上一节( https://www.cnblogs.com/yuanwebpage/p/12362876.html )记录了多路IO复用的第一种方式select函数,以及其相应的缺点。本节记录多路IO复用的第二种方式epoll(在windows系统下叫IOCP)。 1. epoll相关函数   epoll函数克服了select函数的相关缺点,其优点如下: (1) 只需向OS注册一次文件描述符集合,不用每次循环传递; (2) epoll函数会将发生变化的文件描述符单独集中起来,这样每次遍历时只需要遍历发生变化的文件描述符。 (3) 相对于select同时监听的数量有限制,epoll监听数量一般远大于select,这对于多连接的服务器至关重要。 epoll用来集中通知变化的文件描述符结构体如下: struct epoll_event { __uint32_t events; //用来注册是什么事件需要关注,如输入/输出 epoll_data_t data; } typedef union epoll_data { void* ptr; int fd; //发生变化的文件描述符 __uint32_t u32; __uint64_t u64; } epoll_data_t; //可以看到,常用的为events, fd两个 epoll相关的函数总共有3个: #include <sys

python中os模块在windows下的使用

本秂侑毒 提交于 2020-02-26 02:21:22
今天学习了一下Python的os模块,主要是针对文件夹和文件路径的一系列操作。 与Python内置函数相比这里这里的函数功能更多样化,功能也更强大。但是学习过程中我发现很多函数都是只适用于unix系统,可能因为它是开源系统,涉及权限的api都是开放的缘故吧。但也正是如此,当我们再Windows上学习Python时,本来这个板块就难以理解,还具有不可操作性。学起来感觉很受打击。 所以这里把Windows上能用,且适用的函数记录下来,以便于以后复习: 1,os.lseek(fd,pos,how) 方法用于设置文件描述符 fd 当前位置为 pos, how 方式修改。(与内置函数类似但是多了一个文件描述符,pos:0代表开头,1代表当前,2代表结尾,how用一个int型表示方式。例10表示从pos往后数10个字节的位置。) 2.os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 '.' 和'..' 即使它在文件夹中。(使用方法os.listdir(path)在Linux中dir或者ls命令也是相同的效果) 3.os.lstat() 方法用于类似 stat() 返回文件的信息,但是没有符号链接。在某些平台上,这是fstat的别名,例如 Windows。 4,os.fstat() 方法用于返回文件描述符fd的状态,类似 stat(

Linux企业级开发技术(3)——epoll企业级开发之epoll模型

自作多情 提交于 2020-02-25 19:58:50
EPOLL事件有两种模型: Edge Triggered (ET) 边缘触发 只有数据到来,才触发,不管缓存区中是否还有数据。 Level Triggered (LT) 水平触发 只要有数据都会触发。 假如有这样一个例子: 1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符 2. 这个时候从管道的另一端被写入了2KB的数据 3. 调用epoll_wait(2),并且它会返回RFD,说明它已经准备好读取操作 4. 然后我们读取了1KB的数据 5. 调用epoll_wait(2)...... Edge Triggered 工作模式: 如果我们在第1步将RFD添加到epoll描述符的时候使用了EPOLLET标志,那么在第5步调用epoll_wait(2)之后将有可能会挂起,因为剩余的数据还存在于文件的输入缓冲区内,而且数据发出端还在等待一个针对已经发出数据的反馈信息。只有在监视的文件句柄上发生了某个事件的时候 ET 工作模式才会汇报事件。因此在第5步的时候,调用者可能会放弃等待仍在存在于文件输入缓冲区内的剩余数据。在上面的例子中,会有一个事件产生在RFD句柄上,因为在第2步执行了一个写操作,然后,事件将会在第3步被销毁。因为第4步的读取操作没有读空文件输入缓冲区内的数据,因此我们在第5步调用 epoll_wait(2)完成后,是否挂起是不确定的

IO复用解述

寵の児 提交于 2020-02-25 19:54:30
I/O多路复用 select select 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或指定时间后返回它。 select函数原型 #include <sys/select.h> #include <sys/time.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 返回值: 监听到有事件发生的文件描述符的个数,超时为0,错误为 -1. 1.当监视的相应的文件描述符集中满足条件时,比如说读文件描述符集中有数据到来时,内核(I/O)根据状态修改文件描述符集,并返回一个大于0的数。 2.当没有满足条件的文件描述符,且设置的timeval监控时间超时时,select函数会返回一个为0的值。 3.当select返回负值时,发生错误。 参数: maxfd: 是需要监视的最大的文件描述符值+1; rdset、wrset、exset: 是传入传出参数,fd_set类型,分别对应于需要检测的可读文件描述符的集合、可写文件描述符的集合、异常文件描述符的集合。若对其中任何参数条件不感兴趣,则可将其设为NULL。 timeout: 设置超时时间,指定select在返回前没有接收事件时应该等待的时间。 timeval 结构体 struct

I/O多路复用select/poll/epoll

Deadly 提交于 2020-02-25 19:52:32
前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个。因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll。现代操作系统中,线程数已经得到了极大的提升,如NPTL线程软件包可支持数十万的线程。 I/O多路复用 select select 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或指定时间后返回它。 select函数原型 #include <sys/select.h> #include <sys/time.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 返回值: 监听到有事件发生的文件描述符的个数,超时为0,错误为 -1. 1.当监视的相应的文件描述符集中满足条件时,比如说读文件描述符集中有数据到来时,内核(I/O)根据状态修改文件描述符集,并返回一个大于0的数。 2.当没有满足条件的文件描述符,且设置的timeval监控时间超时时,select函数会返回一个为0的值。 3.当select返回负值时,发生错误。 参数: maxfd: 是需要监视的最大的文件描述符值+1; rdset、wrset、exset: 是传入传出参数,fd_set类型