文件描述符

基础IO(文件操作)

一曲冷凌霜 提交于 2020-03-07 02:26:59
文章目录 文件操作 系统调用的文件操作 文件描述符 文件流指针与文件描述符的关系 重定向 动态库和静态库 文件操作 FILE * fopen ( const char * path , const char * mode ) ; FILE:返回值是文件流指针类型 path:需要打开文件的路径,可以是绝对路径,也可以是相对路径(相对与当前目录的路径) mode: r: 以读方式打开,如果当前文件不存在,则会报错 r+: 以读写方式打开,如果当前打开文件不存在,则报错 w: 以写方式打开,如果文件不存在,则在当前目录下创建该文件;如果当前文件存在,则将当前文件截断(清空) w+: 以读写方式打开,其他和w形式相同 a: 以追加方式打开(文件流指针指向当前文件的尾部,不能读),如果文件不存在则创建 a+: 以追加方式打开,如果文件不存在则创建,支持可读可写 size_t fread ( void * ptr , size_t size , size_t nmemb , FILE * stream ) ; ptr: 将fread读到的内容保存在ptr下 size: 块的大小 nmemb: 需要读的块的个数 size* nmemb == 总的字节数量 stream: 文件流指针,从哪里读 返回值: 返回成功读取到的块的个数 用法: 将块的大小指定为1(1个字节)

特殊文件——管道

China☆狼群 提交于 2020-03-05 22:15:05
管道与重定向 概述 对于一些需要进程间的协作来解决问题的场景,进程间的通信是必要的。而最简单的UNIX进程通信机制就是 管道 ,他是由特殊文件表示的。调用者可以通过文件描述符fd[0]和fd[1]来访问它,从fd[1]写入的数据可以按照先进先出的顺序从fd[0]中读出。 文件描述符 :在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。 我们要明白,每个Unix进程(除了可能的守护进程)应均有三个标准的POSIX文件描述符,对应于三个标准流: 整数值 名称 <unistd.h>符号常量 <stdio.h>文件流 0 Standard input STDIN_FILENO stdin 1 Standard output STDOUT_FILENO stdout 2 Standard error STDERR_FILENO stderr 例如: $ls -l | head -5 中, | 就表示一个管道, ls 的标准输出被通过中间通信缓冲区被“连接”到了 head 的标准输入中。 实现重定向 了解了文件描述符的概念后,我们就能利用

select函数详细用法解析

你离开我真会死。 提交于 2020-03-05 06:59:59
1.表头文件 #include #include #include 2.函数原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout); 3.函数说明 select()用来等待文件描述词状态的改变。参数n代表最大的文件描述词加1,参数readfds、writefds和exceptfds 称为描述词组,是用来回传该描述词的读,写或例外的状况。底下的宏提供了处理这三种描述词组的方式: FD_CLR(inr fd,fd_set* set);用来清除描述词组set中相关fd的位 FD_ISSET(int fd,fd_set *set);用来测试描述词组set中相关fd的位是否为真 FD_SET(int fd,fd_set*set);用来设置描述词组set中相关fd的位 FD_ZERO(fd_set *set);用来清除描述词组set的全部位 4.结构体说明 先说明两个结构体: 1) struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(filedescriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件

网络编程技术-----6、I/O复用实现并发服务器

牧云@^-^@ 提交于 2020-03-04 18:18:09
网络编程技术-----6、I/O复用实现并发服务器 一、实验要求 二、实验环境 三、I/O复用涉及到的函数 四、I/O复用实现流程 五、实验代码 六、运行截图 一、实验要求 服务器:     服务器等待接收客户的连接请求,一旦连接成功则显示客户地址,接着接收客户端的名称并显示;然后接收来自该客户的字符串,对接收的字符串按分组进行加密(分组长度为个人学号,密钥为个人序号,分组不够补0),再将加密后的字符发回客户端;之后继续等待接收该客户的信息,直到客户关闭连接,服务器将每个连接的用户所发来的所有数据存储起来,当连接终止后,服务器将显示客户的名字及相应的所有数据。要求服务器具有同时处理多个客户请求的能力。 客户端:     客户首先与相应的服务器建立连接;接着接收用户输入的客户端名称,并将其发送给服务器;然后继续接收用户输入的字符,再将字符串发送给服务器,同时接收服务器发回的加密后的字符串并显示。之后,继续等待用户输入字符串,指导用户输入的是quit,则关闭连接并退出。 二、实验环境 OS:kali 计算机语言:C 编译器:gcc IDE:VsCode 三、I/O复用涉及到的函数 * FD_ZERO(fd_set fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 *

select - I/O多路复用

强颜欢笑 提交于 2020-03-04 07:49:18
使用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

UNIX环境编程学习——文件IO

泄露秘密 提交于 2020-03-04 02:07:10
文件描述符 文件描述符是一个非负整数 所有打开的文件都通过文件描述符引用 按照惯例,UNIX系统shell把文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误关联。使用时可替换为符号常量 STD_FILENO , STDOUT_FILENO 以及 STDERR_FILENO ,常量定义在头文件 <unistd.h> 函数open和openat # include <fcntl.h> int open ( const char * path , int aflag , . . . /* mode_t mode */ ) ; int openat ( int fd , const char * path , int aflag , . . . /* mode_t mode */ ) ; //两函数的返回值:成功返回文件描述符,失败返回-1 参数: path:打开或创建的文件路径。 aflag:说明对该文件的处理方式 O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 读写打开 O_EXEC 只执行打开 O_SEARCH 只搜索打开 以下为一些可选常量 O_APPEND 每次写时都追加到文件的尾端 O_NONBLOCK 文件的本次打开操作和后续的I/O操作设置为非阻塞 对于openat函数中的fd path为绝对路径,fd被忽略。

select、poll和epoll的区别和优缺点

陌路散爱 提交于 2020-03-03 18:03:03
原文地址: https://blog.csdn.net/BaiHuaXiu123/article/details/89948037 I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。select,poll,epoll都是IO多路复用的机制。但 select,poll,epoll本质上都是同步I/O ,因为他们都需要在读写事件就绪后自己负责进行读写, 也就是说这个读写过程是阻塞的 ,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。下来,分别谈谈。 select——> 原理概述: select 的核心功能是调用tcp文件系统的poll函数,不停的查询,如果没有想要的数据,主动执行一次调度(防止一直占用cpu),直到有一个连接有想要的消息为止。从这里可以看出select的执行方式基本就是不同的调用poll,直到有需要的消息为止。 缺点: 1、每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大; 2、同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大; 3、select支持的文件描述符数量太小了,默认是1024。 优点: 1、select的可移植性更好,在某些Unix系统上不支持poll()。 2

Python学习第九天

拟墨画扇 提交于 2020-03-03 08:29:20
生产者-消费者模型: 看下面的例子哦: 1 import threading,queue 2 import time 3 def consumer(n): 4 while True: 5 print("\033[32;1mconsumer [%s]\033[0m get task: %s"%(n,q.get())) 6 time.sleep(1) 7 q.task_done() 8 def producer(n): 9 count=1 10 while True: 11 print('producer [%s] produced a new task: %s'%(n,count)) 12 q.put(count) 13 count += 1 14 q.join()#queue is emtpy 15 print('all tasks has been cosumed by consumers...') 16 q=queue.Queue() 17 c1=threading.Thread(target=consumer,args=[1,]) 18 c2=threading.Thread(target=consumer,args=[2,]) 19 c3=threading.Thread(target=consumer,args=[3,]) 20 21 p=threading.Thread

NIO-EPollSelectorIpml源码分析

十年热恋 提交于 2020-03-02 14:26:21
目录 NIO-EPollSelectorIpml源码分析 目录 前言 初始化EPollSelectorProvider 创建EPollSelectorImpl EPollSelectorImpl结构 fdToKey 管道文件描述符 EPollArrayWrapper 注册 doSelect 关闭EpollSelectorImpl 总结 相关文献 NIO-EPollSelectorIpml源码分析 目录 NIO-概览 NIO-Buffer NIO-Channel NIO-Channel接口分析 NIO-SocketChannel源码分析 NIO-FileChannel源码分析 NIO-Selector源码分析 NIO-WindowsSelectorImpl源码分析 NIO-EPollSelectorIpml源码分析 前言 本来是想学习Netty的,但是Netty是一个NIO框架,因此在学习netty之前,还是先梳理一下NIO的知识。通过剖析 源码 理解NIO的设计原理。 本系列文章针对的是JDK1.8.0.161的源码。 NIO-Selector源码分析 对 Selector 的功能和创建过程进行了分析,本篇对Linux环境下JDK实现的 EPollSelectorImpl 源码进行详细讲解。 本篇文章不会对EPoll算法进行详细介绍,对epoll算法感兴趣或还不了解的同学可以看

[V&N2020 公开赛]

不羁岁月 提交于 2020-03-01 17:30:07
HappyCTFd 考点: CVE-2020-7245 https://www.colabug.com/2020/0204/6940556/ 利用方式: 注册一个如下账号,这里邮箱为buu上的内网邮箱系统 前往/reset_password找回密码 发送完成后把我们注册的用户名改一下: 然后用邮箱的找回密码链接改admin的密码123,登陆,找到flag文件 CHECKIN 考点: 反弹shell linux文件描述符 from flask import Flask, request import os app = Flask(__name__) flag_file = open("flag.txt", "r") # flag = flag_file.read() # flag_file.close() # # @app.route('/flag') # def flag(): # return flag ## want flag? naive! # You will never find the thing you want:) I think @app.route('/shell') def shell(): os.system("rm -f flag.txt") exec_cmd = request.args.get('c') os.system(exec_cmd)