fd

select、poll、epoll优缺点

别等时光非礼了梦想. 提交于 2019-12-10 21:14:48
select、poll、epoll都是IO多路复用。 I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 select的缺点 每次调用select,都需要将进程加入到所有fd的等待队列,每次唤醒都需要从每个队列中移除; 每次都需要将fd集合从用户态传递给内核;进程被唤醒后,程序并不知道哪些fd就绪,还需要再比遍历一次; 因为遍历开销较大,默认只能监视1024个fd poll poll 和 select相似,只是fd集合的方式不同,但是解决了select文件描述符的最大上限 epoll(eventpoll) 功能分离, 将等待队列和阻塞进程分开。 create-创建结构体(eventpoll),ctl-增删fd, wait-唤醒 新增就绪队列 内核维护一个就绪列表,引用就绪的fd,就能避免一次遍历 epoll工作方式:创建eventpoll, 通过ctl增删fd,若fd就绪后,调用回到函数将就绪fd放入就绪列表中,并唤醒在wait中进入睡眠的进程(select 和poll

linux c 获取终端光标的坐标

时间秒杀一切 提交于 2019-12-10 13:28:56
参考资料 http://www.linuxquestions.org/questions/programming-9/get-cursor-position-in-c-947833/ #include <unistd.h> #include <fcntl.h> #include <termios.h> #include <errno.h> #define RD_EOF -1 #define RD_EIO -2 static inline int rd(const int fd) { unsigned char buffer[4]; ssize_t n; while (1) { n = read(fd, buffer, 1); if (n > (ssize_t)0) return buffer[0]; else if (n == (ssize_t)0) return RD_EOF; else if (n != (ssize_t)-1) return RD_EIO; else if (errno != EINTR && errno != EAGAIN && errno != EWOULDBLOCK) return RD_EIO; } return 0; } static inline int wr(const int fd, const char *const data, const

19、共享内存mmap

不问归期 提交于 2019-12-10 05:33:12
1、特点: ① 进程相关的 ② 与 XSI 共享内存一样,需要与同步原语一起使用 ③ 只能是有共同祖先的进程才能使用 2、使用 系统调用 mmap() 用于共享内存的两种方式: ( 1 )使用普通文件提供的内存映射: 适用于任何进程之间。此时,需要打开或创建一个文件,然后再调用 mmap() 典型调用代码如下: fd=open(name, flag, mode); if(fd<0) ... ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过 mmap() 实现共享内存的通信方式有许多特点和要注意的地方,可以参看 UNIX 网络编程第二卷。【 3 】 ( 2 )使用特殊文件提供匿名内存映射: 适用于具有亲缘关系的进程之间。由于父子进程特殊的亲缘关系,在父进程中先调用 mmap() ,然后调用 fork() 。那么在调用 fork() 之后,子进程继承父进程匿名映射后的地址空间,同样也继承 mmap() 返回的地址,这样,父子进程就可以通过映射区域进行通信了。一般来说,子进程单独维护从父进程继承下来的一些变量。而 mmap() 返回的地址,却由父子进程共同维护。 对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式 。此时,不必指定具体的文件,只要设置相应的标志即可。 3、说明 (1

Python os模块方法

[亡魂溺海] 提交于 2019-12-10 04:29:58
os 模块提供了大量有用的方法来处理文件和目录。本章节中的代码实例是在 Ubuntu Linux系统上运行来演示。 大多数有用的方法都列在这里 - 编号 方法 描述/说明 1 os.access(path, mode) 使用真正的 uid/gid 来测试访问指定的路径。 2 os.chdir(path) 将当前工作目录更改为指定路径。 3 os.chflags(path, flags) 将指定的路径的标志设置为数字标志。 4 os.chmod(path, mode) 将路径模式更改为数字模式。 5 os.chown(path, uid, gid) 将指定的路径的所有者和组ID更改为数字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 的文件描述符,如果需要,首先关闭 fd2 。 11 os.fchdir(fd) 将当前工作目录更改为由文件描述符 fd 表示的目录。 12 os.fchmod(fd, mode

fd (int)读写文件

徘徊边缘 提交于 2019-12-10 00:12:09
#include <string.h> #include <stdio.h> #include <fcntl.h> int main() { char *p1 = "This is a c test code"; volatile int len = 0; int fp = open("/home/test.txt", O_RDWR|O_CREAT); for(;;) { int n; if((n=write(fp, p1+len, (strlen(p1)-len)))== 0) //if((n=write(fp, p1+len, 3)) == 0) { //strlen(p1) = 21 printf("n = %d \n", n); break; } len+=n; } return 0; }   原文链接:https://blog.csdn.net/hhhlizhao/article/details/71552588 来源: https://www.cnblogs.com/hshy/p/12014215.html

Swoole 是 PHP 中的 Node.js?

隐身守侯 提交于 2019-12-09 21:27:13
一想到那些可以使用 Node 的同事,一些 PHP 开发者的脸都嫉妒绿了。异步 Node 系统可以在不同协议间共享代码库,并在代码之外提供服务。这真的想让一个人转 Node 开发。实际上 PHP 中也有类似于 Node 的存在,并被列入了 PHP 拓展,叫做 Swoole。 PHP 中的 Node ?Swoole 到底是什么? 我先从 官方文档 中引用下 Swoole 的定义: Swoole:面向生产环境的 PHP 异步网络通信引擎。 使 PHP 开发人员可以编写高性能、可拓展的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务,而无需深入了解非阻塞 I/O 编程和初级 Linux 内核。 Swoole 使用 C 语言编写,作为 PHP 的 基本扩展 存在。听起来可还行,是吧?用 PHP 来运行 HTTP 服务?用 PHP 实现 Websockets ?还有其他的可能性,是不是很风骚?而且所有的这些都会保持极高的性能,我们来看看吧! 如何让它运行? 不同平台的安装方法有差异。 对于 Linux 来说,只需要运行一条 PECL 命令: pecl install swoole MacOS 用户可以使用 brew 命令: brew install swoole brew install homebrew/php/php72-swoole 译者注

sh: 1: Syntax error: Bad fd number

回眸只為那壹抹淺笑 提交于 2019-12-09 17:02:31
Start on Ubuntu 6.10,Using dash default(theDebian Almquist Shell) instead bash(the GNUBourne-Again Shell). 但Login Shell还是bash. 原因是dash更快、更高效,而且它符合POSIX规范。 Ubuntu在启动的时候会运行很多shell脚本,使用dash可以加快启动速度。 bear@kumata:~/riscv/hbird-e-sdk$ ls -l /bin/sh lrwxrwxrwx 1 root root 4 11月 20 2018 /bin/sh -> dash $ sudo rm -rf /bin/sh $ sudo ln -s /bin/bash /bin/sh 来源: https://www.cnblogs.com/kumata/p/12012010.html

通道程序

倖福魔咒の 提交于 2019-12-09 15:16:34
以前做的通道实验 编写一段程序,使用系统调用pipe()创建一无名管道,同时父进程创建一个子进程p1;并使子进程通过管道向父进程传递数据“p1 process is sending data to father.”,父进程通过管道接收到该字符串后输出。  目的:  创建无名管道,实现基于管道的进程间数据通信,掌握管道通信的方法及特征;并进一步理解互斥与同步的含义 #include<stdio.h>  #include<stdlib.h>  main()  {       int r,p1,fd[2];       char buf[50],s[50];      pipe(fd);       while((p1=fork())==-1);      if(p1==0)     {     sprintf(buf,"p1  is sending data to father.");          printf("child  p1!\n");          write(fd[1],buf,50);          sleep(5);          exit(0);     }     else     {          wait(0);          if((r=read(fd[0],s,50))==-1)           printf("can not

2019-2020-1 20165213 20165224 20165311 《信息安全系统设计基础》实验五 通讯协议设计

孤者浪人 提交于 2019-12-08 18:12:42
学习到的内容 Linux下的应用大多可以直接使用,也可以获取源代码自己进行编译、安装,使用源代码安装的过程一般是: configure make make install gcc -o test_openssl test_openssl.c -I /usr/local/ssl/include -L /usr/local/ssl/lib -lcrypto -ldl -lpthread 上面这句表示在编译test_openssl.c时: -o test_openssl test_openssl.c: 将test_openssl.c编译生成可执行文件test_openssl(如果不给出这个选项,gcc就给出预设的可执行文件a.out) -I /usr/local/ssl/include: 将/usr/local/ssl/include目录作为第一个寻找头文件的目录,寻找的顺序是:/usr/local/ssl/include-->/usr/include-->/usr/local/include -L /usr/local/ssl/lib: 将/usr/local/ssl/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/usr/local/ssl/lib-->/lib-->/usr/lib-->/usr/local/lib -L:指定链接库的文件夹地址 -ldl:加载动态库

node 操作文件流 fs 同步与异步 流式文件的写入与读取

a 夏天 提交于 2019-12-08 02:14:32
fs fs ( File System ) 文件系统 在node中通过fs模块来和系统中的文件进行交互 通过fs模块可以对磁盘中的文件做各种增删改查的操作 写入文件 1.同步写入 2.异步写入 3.简单写入 4.流式写入 读取文件 在fs模块中所有的方法都有两个版本 不带sync的,异步方法 带sync的,同步方法 1、同步写入 **1.打开要写入的文件** fs.openSync(path, flags[, mode]) 该方法用来打开一个文件 参数: path:路径,要打开文件的路径 flags:操作的类型,要对文件做什么操作 需要字符串作为参数 "w" 写 "r" 读 "a" 追加 mode:可选参数,一般不传,用来设置文件的权限 返回值: fd 文件的描述符 2.写入并保存 fs.writeSync(fd, string[, position[, encoding]]) 该方法用于向文件中写入内容 参数: fd: 文件的描述符,需要指定要写入文件的描述符 string: 要写入的内容 position: 开始写入的位置 encoding: 写入内容的字符编码,默认utf-8 3.关闭文件 fs.closeSync(fd):: 该方法用来关闭文件 参数: fd 文件的描述符 实例 //引入fs模块 var fs=require('fs'); var fd=fs