fd

基础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个字节)

Winsock解析

左心房为你撑大大i 提交于 2020-03-06 04:33:33
一、基本知识 1、 Winsock,一种标准API ,一种网络 编程 接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信。具有两个版本: Winsock 1: Windows CE平台支持。 头文件:WinSock.h 库:wsock32.lib Winsock 2: 部分平台如Windows CE貌似不支持。通过前缀WSA可以区别于Winsock 1版本。个别函数如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都属于Winsock 1.1规范的函数; 头文件:WinSock2.h 库:ws2_32.lib mswsock.h用于编程扩展,使用时必须链接mswsock.dll。 2、网络协议: IP (Internet Protocol) 网际协议,无连接协议; TCP (Transmission Control Protocol) 传输控制协议; UDP (User Datagram Protocol) 用户数据协议; FTP (File Transfer Protocol) 文件传输协议; HTTP (Hypertext Transfer Protocol) 超文本传输协议; 3、字节存储顺序: big_endian:大端存储,存储顺序从高位到低位,地址指向最高有效字节。在网络中将IP和端口指定为多字节时使用大端存储

特殊文件——管道

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 的标准输入中。 实现重定向 了解了文件描述符的概念后,我们就能利用

几种网络服务器模型的介绍与比较

五迷三道 提交于 2020-03-05 16:52:59
原文链接 前言 事件驱动为广大的程序员所熟悉,其最为人津津乐道的是在图形化界面编程中的应用;事实上,在网络编程中事件驱动也被广泛使用,并大规模部署在高连接数高吞吐量的服务器程序中,如 http 服务器程序、ftp 服务器程序等。相比于传统的网络编程方式,事件驱动能够极大的降低资源占用,增大服务接待能力,并提高网络传输效率。 关于本文提及的服务器模型,搜索网络可以查阅到很多的实现代码,所以,本文将不拘泥于源代码的陈列与分析,而侧重模型的介绍和比较。使用 libev 事件驱动库的服务器模型将给出实现代码。 本文涉及到线程 / 时间图例,只为表明线程在各个 IO 上确实存在阻塞时延,但并不保证时延比例的正确性和 IO 执行先后的正确性;另外,本文所提及到的接口也只是笔者熟悉的 Unix/Linux 接口,并未推荐 Windows 接口,读者可以自行查阅对应的 Windows 接口。 阻塞型的网络编程接口 几乎所有的程序员第一次接触到的网络编程都是从 listen()、send()、recv() 等接口开始的。使用这些接口可以很方便的构建服务器 / 客户机的模型。 我们假设希望建立一个简单的服务器程序,实现向单个客户机提供类似于“一问一答”的内容服务。 图 1. 简单的一问一答的服务器 / 客户机模型 我们注意到,大部分的 socket 接口都是阻塞型的。所谓阻塞型接口是指系统调用(一般是

一个简单的socket服务器实现

萝らか妹 提交于 2020-03-05 07:36:18
目录 什么是socket socket基本操作API函数 socket服务器的实现 附录:网络字节序与主机字节序 什么是socket socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,在网络应用程序设计时,由于TCP/IP的核心内容被封装在操作系统中,如果应用程序要使用TCP/IP,可以通过系统提供的TCP/IP的编程接口来实现,socket是操作系统抽象出一个概念,连接传输层与应用层的上层应用 如图中所示套接字(socket)是一个抽象层,继承了Linux下“万物皆文件”的思想,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合 socket基本操作API函数 1. socket()函数 函数原型及所需的头文件 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); (1)作用:socket()函数用来创建一个socket描述符,socket描述符类似于普通的文件描述符,可以进行读写操作,一个socket描述符唯一指定一个socket (2)三个参数: domain:即协议域

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);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 *

epoll三种工作模式

女生的网名这么多〃 提交于 2020-03-04 13:04:05
水平触发模式-根据读来解释 只要fd对应的缓冲区有数据 epoll_wait返回 返回的次数与发送数据的次数没有关系 epoll默认的工作模式 边沿触发模式 - ET fd - 默认阻塞属性 客户端给server发数据: 发一次数据server 的 epoll_wait返回一次  不在乎数据是否读完  如果读不完, 如何全部读出来? while(recv()); 数据读完之后recv会阻塞 解决阻塞问题 设置非阻塞 - fd 边沿非阻塞触发 效率最高 如何设置非阻塞 open() □ 设置flags □ 必须 O_WDRW | O_NONBLOCK □ 终端文件: /dev/tty fcntl() □ int flag = fcntl(fd, F_GETFL); □ flag |= O_NONBLOCK; □ fcntl(fd, F_SETFL, flag); 将缓冲区的全部数据都读出 while(recv() > 0) {printf(): } epoll_wait 调用次数越多, 系统的开销越大 水平触发模式 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <string.h> #include <sys/socket.h> #include

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

Linux编程实现DS18B20对树莓派温度的探测

 ̄綄美尐妖づ 提交于 2020-03-04 07:14:00
目录 (一)项目简介 (二)代码以及调试 (三)总结 (一)项目简介 DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点,本次实验项目是依据树莓派对DS18B20 1线温度传感器的支持(一线协议),再通过编程实现温度的探测。 DQ 为数字信号输入/输出端; GND 为电源地; VCC 为外接供电电源输入端; 其中两者端口的连接方式如下: 树莓派 的 ground 端(pin 06脚)------------连接DS18B20的 GND的端口; 树莓派的 gpio 04 端(pin 07 脚)--------------连接DS18B20的 DQ的端口; 树莓派的 3.3V 端(pin 01脚)-------------连接DS18B20的 VCC端口; (二)代码以及调试 1.通过SecurtCRT远程登录到树莓派服务器上,并找到该文件所在的位置,如下图在根目录下的w1_slave文件中: 先调用 open() , read() , close() 三个基本的文件I/O函数进行文件内容的读取: int main ( int argc , char * * argv ) { int fd ; char buf [ 128 ] ; fd = open ( "/sys/bus/w1/devices/28-041731f7c0ff