文件描述符

node 文件的同步、异步写入

折月煮酒 提交于 2020-01-31 11:18:25
文件系统 (1)通过node来操作系统中的文件 (2)使用前要先引入fs核心模块,直接require引入,无需下载 操作文件系统两种方式 同步文件系统会阻塞程序,除非操作完成,不会执行下面代码 异步文件系统不会阻塞程序,而是在操作完成后通过回调函数返回结果 文件的同步写入 (1)fs.openSync(path,flags,mode)返回一个文件特殊值,可通过返回值对文件进行操作 path:路径 flags:打开文件操作的类型 'r':只读 'w':只写 mode:文件权限,一般针对linux,可不写 (2)fs.writeSync(文件特殊值,'写入内容',距离首部距离数值/可选,'字符编码格式默认为utf-8'/可选); (3)fs.closeSync(文件特殊值); //保存并关闭文件,减小服务器开销,否则会一直占用服务器 以追加方式 fs.appendFileSync(路径,'内容'); 文件的异步写入 (1)fs.open(路径,文件操作类型,回调函数function(err,fd){ 回调函数有两个参数,err错误对象,没有为null,fd文件描述符 可通过arguments查看 }); 'r':只读 'w':只写 //没有文件会自动创建一个文件 注意:**必须在打开函数的回调函数中写** (2)fs.write(文件描述符,'内容',距首部位置数值/可选,编码格式

select函数

倾然丶 夕夏残阳落幕 提交于 2020-01-29 02:55:29
select函数 select()函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生 或经历一段指定时间后才唤醒它 #include <sys/select.h> #include <sys/time.h> // 返回值:若有就绪描述符,则返回就绪描述符数目;若超时则返回0,出错返回-1 int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); select的参数: maxfdp1: 指定待测试的描述符个数,它的值是待测试的最大描述符加1 readset、writeset、exceptset: 指定让内核测试读、写、异常条件的描述符 异常条件: 某个套接字的带外数据到达 某个已置为分组模式的伪终端存在可以从其主端读取的控制状态信息 fd_set *: select使用的描述符集 系统提供了4个宏对描述符集进行操作: #include <sys/select.h> #include <sys/time.h> void FD_SET(int fd, fd_set *fdset); // 设置文件描述符集fdset中对应于文件描述符fd的位(设置为1) void FD_CLR(int fd, fd

shell脚本-重定向

青春壹個敷衍的年華 提交于 2020-01-27 03:55:31
写脚本代码的时候重定向是一个很重要的功能,比如打印日志什么的都需要用到。 大体来说: 重定向分为两种,一种叫临时重定向,一种叫长久重定向。 临时重定向就是每次在输出的时候都必须指定重定向:   echo  good for u   > log 这里实际上省略了一个1(标准输入),代表将标准输入转向到log中。 linux每个进程都有0, 1, 2 三个文件描述符。 重定向就是将这些文件描述符关联到相应的文件(设备), 比如默认的是0关联到标准输入,1关联到标准输出, 2关联到标准错误 如果你觉得你需要将他们关联到不同的地方那么就 进行重定向----实际上就是改变0,1,2 关联到的文件, 比如上面的例子, 1 默认关联的是标准输出,也就是显示器, 经过上面 的更改, 那么1 现在关联到了log文件之中。 我们echo 输出 总是输出到 文件描述符1 中的。 如果1 关联的是显示器就输入到显示器上, 1 关联的是log文件,那么就显示到log文件上 举个栗子:     0  -----  键盘     1  -----  显示器          2  -----  显示器 重定向就是改变对应关系。经过上面的命令后,对应关系变成了这样。 注意程序中的输入输出都是操作的文件描述符(也就是0,1,2这些数字),这些数字关联什么设备就从对应的设备进行 操作,这点明白后就了解重定向了。   

python IO模式(多路复用和异步IO深入理解)

我只是一个虾纸丫 提交于 2020-01-26 04:38:13
1、事件渠道模型。事件渠道为异步IO的原型。 2、IO模式,一次IO调用会经历两个阶段。一、等待数据阶段,将数据从网络或者是磁盘读取到系统内核(kennel) 二、将数据从内核拷贝到进程中。 基于这两个阶段,linux系统下面产生了五种网络网络模式方案。 -阻塞I/O(blocking IO) -非阻塞I/O(nobokcing IO) - I/O多路复用。(I/O multiplexing) - 信号驱动 -异步I/O(async) 由于信号驱动使用较少,主要介绍其余四种模式。 3、阻塞I/O(blocking IO)在数据准备阶段和贝考数据阶段都会阻塞。用户调用recefrom 以后会一直等待数据拷贝到用户内存未至。 2、非阻塞I/O(nobokcing IO),用户会一直调用recefrom,如果数据没有准备好。会返回一个ERROR。一直到数据准备好。因此在读数据阶段不会卡住。 3、epoll模式,也就是IO多路复用模式。一次性可以处理多个网络IO。调用select方法。首先会卡住。直到其中一个有数据就会立即返回。然后拷贝数据。然后进入下一个循环 4、异步IO,异步I/O不会阻塞。当用户进程发起read操作以后。可以立刻开始做其他的事情(相当于告诉在内核注册一个事件。由内核进行监控,处理完以后内核主动通知)。而另一方面从kennel角度看当他收到一个async read以后

文件I/O

岁酱吖の 提交于 2020-01-26 03:02:09
目录: 1、文件I/O 1.1 ---- C标准函数与系统函数的区别 1.2 ---- PCB概念 1.3 ---- open/close 1.4 ---- read/write 1.5 ---- 阻塞和非阻塞 1.6 ---- lseek 1.7 ---- fcntl 1.8 ----ioctl 1.1 C标准函数与系统函数的区别 有一定编程基础的小伙伴应该都接触过文件编程吧,file. 在C语言里面是包一个<file.h>的头 每一个文件都有一个缓冲区,C和系统函数的区别也不想说太多,系统函数可以实现不同进程共享一个缓冲区,而C函数不行。 1.2 PCB的概念 PCB(process control block),进程控制块。 Linux的进程控制块为一个由结构task_struct所定义的数据结构,task_struct存/include/ linux/sched.h 中,其中包括管理进程所需的各种信息。 在创建一个新进程时,系统在内存中申请一个空的task_struct区,即空闲PCB块,并填入所需信息。 1.3 open/close 首先了解一下文件描述符,和文件描述符表。 注意:以下内容记住基于进程,所以文件描述符和符表都存在PCB里面了。 文件描述符表:纪录文件描述符使用情况的表。 文件标书符:在一个进程创建时吗,默认自动打开三个文件,即生成了三个文件描述符:

Python OS学习笔记

夙愿已清 提交于 2020-01-24 01:31:51
Python3 os.chown() 方法 概述 os.chown() 方法用于更改文件所有者,如果不修改可以设置为 -1, 你需要超级用户权限来执行权限修改操作。 只支持在 Unix 下使用。 语法 chown() 方法语法格式如下: os.chown(path, uid, gid); 参数 path -- 设置权限的文件路径【就是你要改的这个文件在哪里】 uid -- 所属用户 ID【你要改给谁】 gid -- 所属用户组 ID【你要改给那一个组】 Python3 os.dup2() 方法 概述 os.dup2() 方法用于将一个文件描述符 fd 复制到另一个 fd2。Unix, Windows 上可用。 语法 dup2() 方法语法格式如下:os.dup2(fd, fd2); 参数 fd -- 要被复制的文件描述符 fd2 -- 复制的文件描述符 import os # 打开一个文件 f=open('txt','a') # 将这个文件描述符代表的文件,传递给 1 描述符指向的文件(也就是 stdout) os.dup2(f.fileno(), 1) # 关闭文件 f.close() # print 输出到标准输出流,就是文件描述符1 print('runoob') print('google') 感觉就是将本来应该输出到屏幕上的输出到文件里 来源: https://www

linux lsof 详解

安稳与你 提交于 2020-01-23 22:31:43
lsof(list open files)是一个查看当前系统文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息。 【lsof可打开的文件】 普通文件 目录 网络文件系统的文件 字符或设备文件 (函数)共享库 管道,命名管道 符号链接 网络文件(例如:NFS file、网络socket,unix域名socket) 还有其它类型的文件,等等 【命令参数】 -a 列出打开文件存在的进程 -c program -g 列出GID号进程详情 -d <文件号> 列出占用该文件号的进程 +d<目录> 列出目录下被打开的文件 +D<目录> 递归列出目录下被打开的文件 -n<目录> 列出使用NFS的文件 -i <条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip ) -p<进程号> 列出指定进程号所打开的文件 -u username -h 显示帮助信息 -v 显示版本信息 【lsof输出各列信息】 COMMAND:进程的名称 PID:进程标识符 PPID:父进程标识符(需要指定-R参数) USER:进程所有者 PGID:进程所属组 FD:文件描述符

网络编程——网络基础(二)

旧街凉风 提交于 2020-01-22 01:09:53
Socket是何方妖怪? 1.socket与进程的关系 1).socket与进程间的关系:socket 用来让一个进程和其他的进程互通信息(IPC),而Socket接口是TCP/IP网络的API接口函数。 2).进程间通信(本机内) 进程间通信(不同计算机,要联网) 2、socket与文件的关系——如何理解socket是种特殊的I/O? 1)Socket最先应用于Unix操作系统,如果了解Unix系统的I/O的话,就很容易了解Socket了,因为Socket数据传输其实就是一种特殊的I/O。 2)可对其进行文件操作 3)有文件描述符。而文件描述符的本质是一个非负整数。只是用于区分。类似的还有进程ID。 3.服务器端口与连接个数的关系 1)服务端在8088上监听,然后生成一个新的socket与client通讯。(注意:服务器端监听端口是 不变的,但socket连接可以一直生成,一个线程对应一个socket.) 同一时刻,一个端口只能建立一个连接。 在一个端口监听,但是在监听端口的同时,生成一个等待队列,每一个来自客户端的连接都会送入等待队列中,服务器利用一定的算法进行选择相应的连接请求处理,所以在一个端口可以监听多各请求嘛。如果同时的连接过多,服务器相应每个连接的时间就会相应的变长。就会变慢。 2)QQ的实现方法就是在登陆的时候告诉服务器你已经登陆,发送消息的时候

linux 重定向命令

╄→尐↘猪︶ㄣ 提交于 2020-01-20 20:28:44
标准输入,输出和错误 --------------------------------- 文件文件 描述符 --------------------------------- 输入文件—标准输入 0 输出文件—标准输出 1 错误输出文件—标准错误 2 --------------------------------- COMMAND_OUTPUT > 2 # 将stdout重定向到一个文件. 3 # 如果这个文件不存在, 那就创建, 否则就覆盖. 4 5 ls -lR > dir-tree.list 6 # 创建一个包含目录树列表的文件. 7 8 : > filename 9 # >操作, 将会把文件"filename"变为一个空文件(就是size为0). 10 # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同). 11 # :是一个占位符, 不产生任何输出. 12 13 > filename 14 # >操作, 将会把文件"filename"变为一个空文件(就是size为0). 15 # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同). 16 # (与上边的": >"效果相同, 但是某些shell可能不支持这种形式.) 17 18 COMMAND_OUTPUT >> 19 # 将stdout重定向到一个文件. 20 #

[ios5 cocos2d游戏开发实战] 笔记4 socket

二次信任 提交于 2020-01-20 11:23:44
socket 连接 SOCKET sock_client; sock_client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == sock_client) { std::cout << "Invalid socket." << std::endl; WSACleanup(); return 0; } sockaddr_in addr_sev; addr_sev.sin_family = AF_INET; addr_sev.sin_port = htons(PORT_SERVER); addr_sev.sin_addr.s_addr = inet_addr("127.0.0.1"); if (SOCKET_ERROR == connect(sock_client, (sockaddr *)&addr_sev, sizeof(addr_sev))) { std::cout << "Failed to connect." << std::endl; WSACleanup(); return 0; } 使用 POSIX创建线程 参见ios笔记 线程 socket文件描述符 参考链接:http://blog.csdn.net/kjing/article/details/6962440