首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在向不可写内存写入时,根据表示文件、匿名管道或套接字的文件描述符,read()的行为会有所不同

在向不可写内存写入时,根据表示文件、匿名管道或套接字的文件描述符,read()的行为会有所不同。

对于表示文件的文件描述符,read()函数会返回-1,并设置errno为EBADF,表示文件描述符无效。

对于表示匿名管道的文件描述符,read()函数会阻塞,直到有数据可读。如果管道中没有数据可读,read()函数会一直阻塞。

对于表示套接字的文件描述符,read()函数的行为取决于套接字的类型和状态。如果套接字是阻塞的,read()函数会阻塞,直到有数据可读。如果套接字是非阻塞的,read()函数会立即返回,如果没有数据可读,返回-1,并设置errno为EAGAIN或EWOULDBLOCK。如果套接字是TCP套接字,read()函数会读取尽可能多的数据,直到缓冲区满或对端关闭连接。如果套接字是UDP套接字,read()函数会读取一个完整的数据报。

总结起来,read()函数在向不可写内存写入时的行为取决于文件描述符的类型和状态。对于文件描述符无效的情况,返回-1并设置errno为EBADF。对于表示匿名管道的文件描述符,会阻塞直到有数据可读。对于表示套接字的文件描述符,阻塞或非阻塞的行为取决于套接字的类型和状态。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(移动推送、移动分析、移动测试等):https://cloud.tencent.com/product/mobile
  • 腾讯云块存储(CBS):https://cloud.tencent.com/product/cbs
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云游戏多媒体引擎(GME):https://cloud.tencent.com/product/gme
  • 腾讯云音视频处理(VOD):https://cloud.tencent.com/product/vod
  • 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux文件类型

二.详解 管道文件 管道分为匿名管道和命名管道管道都是一端写入、另一端读取,它们是单方向数据传输,它们数据都是直接在内存中传输管道是进程间通信一种方式,例如父进程,子进程读。...在编程语言中,匿名管道是通过创建两个文件句柄文件描述符(例如A、B)来实现,一个文件句柄用于数据(例如A写入端,数据写入A将自动推入B中),另一个文件句柄用于读数据(即B)。...shell中,可以使用mknod命令mkfifo命令创建命名管道某些特殊需求shell脚本时,命名管道非常有用。...套接需要成对才有意义,也就是分为两端,每一端都有用于读、文件描述符(文件句柄),相当于两根双向通信管道。...服务端套接创建(socket()函数,创建后就会有一个文件句柄文件描述符供读、操作)后,还要绑定地址(通过bind()函数)和监听端口(通过listen()函数),客户端则只需要创建套接字后,直接使用

3K10

C++进程间通信 详解2

进程间完成数据传递需要借助操作系统提供特殊方法,如:文件管道、信号、共享内存、消息队列、套接、命名管道等。随着计算机蓬勃发展,一些方法由于自身设计缺陷被淘汰或者弃用。...有如下特质: 1) 其本质是一个伪文件(实为内核缓冲区) 2)由两个文件描述符引用,一个表示读端,一个表示端。 3) 规定数据从管道端流入管道,从读端流出。...管道读写行为 使用管道需要注意以下4种特殊情况(假设都是阻塞I/O操作,没有设置O_NONBLOCK标志): 1)如果所有指向管道文件描述符都关闭了(管道端引用计数为0),而仍然有进程从管道读端读数据...2) 如果有指向管道文件描述符没关闭(管道端引用计数大于0),而持有管道进程也没有管道数据,这时有进程从管道读端读数据,那么管道中剩余数据都被读取后,再次read阻塞,直到管道中有数据可读了才读取数据并返回...4)如果有指向管道读端文件描述符没关闭(管道读端引用计数大于0),而持有管道读端进程也没有从管道中读数据,这时有进程管道数据,那么管道满时再次write阻塞,直到管道中有空位置了才写入数据并返回

51310

进程间7种通信方式_linux 进程间通信

// 需要文件 #include // 通过pipe()函数来创建匿名管道 // 返回值:成功返回0,失败返回-1 // fd参数返回两个文件描述符 // fd[0]指向管道读端...int pipe (int fd[2]); 通过匿名管道实现进程间通信步骤如下: 父进程创建管道,得到两个⽂件描述符指向管道两端 父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。...bind 系统调用,其原形如下: int bind(int socket, const struct sockaddr *address, size_t address_len); 其中 socket表示服务器端套接描述符...size_t *address_len); 其中 socket 表示服务器端套接描述符;backlog 表示排队连接队列长度(若有多个客户端同时连接,则需要进行排队);address 表示当前连接客户端本地地址..., char *buffer, size_t len); 其中 socket 为套接描述符;len 为需要发送需要接收数据长度; 对于 read 系统调用,buffer 是用来存放接收数据缓冲区

2.7K20

何为文件句柄??_窗口句柄是什么意思

一、 百度百科解释: 文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件路径来打开文件。...要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存地址和要拷贝字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件。...一个句柄就是你给一个文件,设备,套接(socket)管道一个名字, 以便帮助你记住你正处理名字, 并隐藏某些缓存等复杂性 二、文件句柄和文件描述符 我们日常编程中经常会遇到文件描述符(file...,存在则报错】 a, 追加模式【可读;不存在则创建;存在则只追加内容】 “+” 表示可以同时读写某个文件 r+, 读写【可读,可写】 w+,读【可读,可写】 x+ ,读【可读,可写】 a...+, 读【可读,可写】 “b”表示以字节方式操作 rb r+b wb w+b xb w+b ab a+b 注:以b方式打开时,读取到内容是字节类型,写入时也需要提供字节类型

1.4K30

进程间8种通信方式详解

// 需要文件 #include // 通过pipe()函数来创建匿名管道 // 返回值:成功返回0,失败返回-1 // fd参数返回两个文件描述符 // fd[0]指向管道读端...int pipe (int fd[2]); 通过匿名管道实现进程间通信步骤如下: 父进程创建管道,得到两个⽂件描述符指向管道两端 父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。...bind 系统调用,其原形如下: int bind(int socket, const struct sockaddr *address, size_t address_len); 其中 socket表示服务器端套接描述符...size_t *address_len); 其中 socket 表示服务器端套接描述符;backlog 表示排队连接队列长度(若有多个客户端同时连接,则需要进行排队);address 表示当前连接客户端本地地址..., char *buffer, size_t len); 其中 socket 为套接描述符;len 为需要发送需要接收数据长度; 对于 read 系统调用,buffer 是用来存放接收数据缓冲区

47.7K62

进程间通信 IPC 完全指南:各种机制原理与实战

这个调用返回两个文件描述符,一个用于读操作,一个用于操作。...两个文件描述符形成了一个单向数据流通道。数据传输:操作:进程可以通过文件描述符将数据写入管道。数据会被存储管道缓冲区中,直到被读取。...匿名管道没有名称,它们管道创建时只进程内有效,无法系统中被其他进程访问。命名管道(FIFO):命名管道是一种具有名称特殊文件,它在文件系统中存在,允许不相关进程之间进行通信。...同步与更新: 内存映射文件修改直接影响到对应文件内容,即使文件内容被修改也反映在内存中。操作系统提供 msync() 函数来同步内存映射区域修改到文件中,或者不同进程间共享修改后数据。...释放映射: 当不再需要内存映射文件时,进程可以调用 munmap() 函数释放映射,操作系统取消虚拟地址空间中映射关系,并根据需要更新文件修改到磁盘上。

71520

详解操作系统之进程间通信 IPC (InterProcess Communication)

管道/匿名管道(pipe) 管道是半双工,数据只能一个方向流动;需要双方通信时,需要建立起两个管道。...有名管道名字存在于文件系统中,内容存放在内存中。 匿名管道和有名管道总结: (1)管道是特殊类型文件满足先入先出原则条件下可以进行读写,但不能进行定位读写。...(3)无名管道阻塞问题:无名管道无需显示打开,创建时直接返回文件描述符,在读写时需要确定对方存在,否则将退出。如果当前进程无名管道一端数据,必须确定另一端有某一进程。...内存映射文件(Memory-mapped file),称“文件映射”、“映射文件”,是一段虚内存逐字节对应于一个文件文件资源,使得应用程序处理映射部分如同访问主内存。 6....(2)一旦连接建立,我们就可以像使用底层文件描述符那样用套接来实现双向数据通信(通过流进行数据传输)。 三、参考引用 1. 进程间通信--管道 2.

3.1K30

unix环境高级编程(下)-高级IO和进程间通信篇

然后介绍socket编程连接建立,数据传输等。 高级进程间通信 高级进程间通信提供一种可以进程间传递文件描述符机制,包括STREAMS管道和unix域套接 一. 高级IO 1....addr:存储映射起始地址,通常设置为0,表示由系统选择地址然后作为返回值返回 port:说明对存储映射区保护要求,权限不能超过文件本身权限 PORT_READ:映射区可读 PORT_WRITE:映射区可写...网络进程间通信:套接 1. 套接描述符 套接是通信端点抽象,是用文件描述符实现 创建套接描述符: ? domain:套接域 ? type:套接类型 ?...表示根据套接类型默认选择协议 关闭套接:close shutdown:禁止套接输入/输出,可只关闭一个方向 2....概述 Streams管道和unix套接,这两种高级IPC,可以进程间传递文件描述符 服务进程可以使他们打开文件描述符与特定名字相关联 客户进程可以使用这些名字与服务器通信 操作系统会为每个客户进程提供一个独自

1.4K42

Linux进程通信

管道可以看成是一种特殊文件,对于它读写可以使用文件IO如read、write函数,因为管道文件系统中并不存在对应文件,所以不支持lseek()等操作。...当读一个端已经被关闭管道时,在所有数据都被读取后,read返回0,以指示达到了文件结束处。 管道数据 读端存在时,管道中写入数据时,管道缓冲区一有空闲区域,写进程就会试图管道写入数据。...参数:sockfd:listen后文件描述符(socket()建立);addr:返回ClientIP、端口等信息,确切格式由套接地址类别(如TCPUDP)决定;若addr为NULL,则addrlen...参数:sockfd:接收端套接描述符;buf:指向容纳接收信息缓冲区指针;nbytes:buf缓冲区大小;flags:接收标志,一般置为0: MSG_DONTWAIT:仅本操作非阻塞 MSG_OOB...参数:sockfd:指定发送端套接描述符;buf:存放要实际发送数据缓冲区;nbytes:实际要发送数据字节数;flags:一般设置为0: MSG_DONTROUTE:绕过路由表查找 MSG_DONTWAIT

1.9K20

UNIX(进程间通信):09 管道到底是什么

pipe ●s套接文件socket 管道可以克服使用文件进行通信两个问题,具体表现为: · 限制管道大小。...2.管道读写 管道实现源代码fs/pipe.c中,pipe.c中有很多函数,其中有两个函数比较重要,即管道读函数pipe_read()和管道函数pipe_wrtie()。...当写进程管道中写入时,它利用标准库函数write(),系统根据库函数传递文件描述符,可找到该文件 file 结构。...写入进程实际处于可中断等待状态,当内存中有足够空间可以容纳写入 数据,内存被解锁时,读取进程唤醒写入进程,这时,写入进程将接收到信号。...但是,进程可以没有数据内存被锁定时立即返回错误信息,而不是阻塞该进程,这依赖于文件管道打开模式。反之,进程可 以休眠索引节点等待队列中等待写入进程写入数据。

1.2K10

CVE-2022-0847-DirtyPipe原理 | 文件提权

使用管道而不是通过套接复用(像FastCGI和AJP那样)有一个主要优势:你可以应用程序和Web服务器中使用splice()来获得最大效率。...CPU管理最小内存单位是一个页面(通常是4 kB)。 ​ Linux内存管理最底层,所有的东西都是关于页。如果一个应用程序向内核请求内存,它将得到一些(匿名)页。...Linux内核技巧:sendfile()系统调用允许应用程序将文件内容发送到套接中,而不需要往返于用户空间(这种优化通过HTTP提供静态文件网络服务器中很流行)。...如果最近一次没有完全填满该页,接下来可能追加到现有的页,而不是分配一个新页。这就是 "匿名 "管道缓冲区工作方式(anon_pipe_buf_ops)。 ​...它不仅在没有权限情况下起作用,而且不可变文件、只读btrfs快照和只读挂载(包括CD-ROM挂载)上也起作用。这是因为页面缓存始终是可写(由内核决定),而管道写东西从不检查任何权限。

72930

进程间通信详解

1、特征 FIFO可以无关进程之间交换数据,与无名管道不同。 FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。...一旦创建了一个 FIFO,就可以用一般文件I/O函数操作它。 FIFO通信方式类似于进程中使用文件来传输数据,只不过FIFO类型文件同时具有管道特性。...对于管道和消息队列等通信等方式,则需要在内核和用户空间进行四次数据复制,而共享内存则只需要两次数据复制:一次从输入文件到共享内存区,另一个从共享内存区到输出文件。...所以Unix提供了一个套接特殊版本,它使用和套接一摸一样api,但是地址不再是网络端口,而是文件。相当于我们通过某个特殊文件来进行套接通信。...跟unix域套接区别是,不需要创建socket文件并绑定监听。 socketpair返回两个套接对象,一个用于读一个用于,它有点类似于pipe,只不过pipe返回是两个文件描述符,都是整数。

40520

IO多路复用selectpollepoll

: EPOLLIN :表示对应文件描述符可以读(包括对端SOCKET正常关闭); EPOLLOUT:表示对应文件描述符可以; EPOLLPRI:表示对应文件描述符有紧急数据可读(这里应该表示有带外数据到来...epoll工作ET模式时候,必须使用非阻塞套接口,以避免由于一个文件句柄阻塞读/阻塞操作把处理多个文件描述符任务饿死。...对这样套接操作将不阻塞并返回一个大于0值(也就是返回准备好写入数据)。可以用SO_SNDLOWAT套接选项设置该套接低水位标记。...对于TCP和UDP套接而言,低水位默认值为2048,发送缓冲区默认大小为8K,这意味着,默认情况下,一个套接连接成功后,总是可写; (2)“已连接socket”:该连接半部关闭(主动发送了FIN...对这样套接操作将产生SIGPIPE信号,该信号缺省行为是终止进程; (3)“已连接socket”:其上有一个套接错误待处理。

1K20

进程通信

ps:匿名管道是 特殊文件 ,只 内存 ,不存文件系统 2)管道,就是内核里一串缓存 。...,对应 TCP、SOCK_DGRAM 表示数据报,对应 UDP、SOCK_RAW表示原始套接;protocal (基本废弃):写成 0 即可,原本是用来指定通信协议,通过前两个完成 2、不同socket...,得到文件描述符; 2)服务端调 bind ,绑定IP 地址和端口; 调 listen 监听; 调accept ,等待客户端连接; 3)客户端调 connect ,服务器端地址和端口发起连接请求;...4)服务端 accept 返回用于传输 socket 文件描述符;ps:连接成功 返回已完成连接socket ,通过read 和 write 读写,像往文件流里面写东西一样 5)客户端调 write...2) 每次通信, 调sendto 和 recvfrom ,传入目标主机 IP 地址 和 端口 (3)本地进程间通信socket 编程模型 用于 同一主机通信 , 1)接口和 IPv4 、IPv6 套接编程一致

1.1K45

CSAPP 网络编程 笔记

不能,SO_OOBINLINE 选项表示将紧急数据留到普通套接口缓冲区,所以正常 read 就行了。 可通过 sockatmark 读取带外标识位置。 阻塞与非阻塞 为什么阻塞?...何时完成 aio_read 给内核传递描述、缓冲区指针、缓冲区大小、文件偏移,并告诉内核当操作完成时如何通知进程。...共享内存 进程能够涉及内核而访问其中数据 使用多个进程可以访问同一块内存空间,是单机最快可用 IPC 形式 针对其他通信机制运行效率较低而设计,往往与其他通信机制结合来达到进程间同步和互斥...,如信号量 问题 命名管道管道区别 命名管道以 FIFO 形式存在于文件系统中,与 FIFO 创建进程无亲缘关系进程只要能访问该路径,就能彼此通信 管道最后一个关闭后自动消失,而 FIFO 需要通过...那些发生变化文件描述符 fd_set 中对应位都设为 1,表示 socket 可读或者可写,从而可以进行读写操作,然后再调用 select,接着盯下一轮变化。

55530

socket常用函数_socket recv函数

EFAULT: 地址sv无法指向有效进程地址空间内。 EMFILE: 已经达到了系统限制文件描述符,或者该进程使用过量描述符。...EOPNOTSUPP:指定协议不支持创建套接对。 EPROTONOSUPPORT:本机不支持指定协议。 注意: 1、该函数只能用于UNIX域(LINUX)下。...2、只能用于有亲缘关系进程(线程)间通信。 3、所创建套节对作用是一样,均能够可读可写(而管道PIPE只能进行单向读)。...val; printf("%d send message: %d\n", pid, val); write(sv[0], &val, sizeof(val)); //父进程管道数据...// read(sv[0], &val, sizeof(val)); //如果进程数据,将会导致此处堵塞 //printf("%d receive message: %d\n"

1.5K20

Unix域协议学习小结

根据《Unix网络编程卷1》,选择Unix域套接有以下三点理由: 尽管使用API类似于网络套接,但是所有的通信几乎都是发生在操作系统内核层面,往往比同一个主机上使用TCP通信快一倍 Unix域套接可以同一主机不同进程间传递描述符...网络套接地址则是IP+Port,Unix域套接地址是一个socket类型文件文件系统中路径,这个socket文件由bind调用创建。...命令查看对应文件类型,例如srwxrwxr-x 1 xxx xxx 0 Mar 12 13:23 /tmp/srv_sock,其中s就表示套接套接存在,但是没有与之关联打开描述符 套接存在...但是pipe函数创建管道是半双工(要么读、要么,不能够同时一个管道中进行读写)。但实际应用中,经常需要同时进行读写。...但是如果一个套接(sockfd1)中写入,再从该套接总读取,就会阻塞,只能够另一个套接(sockfd0)中读取 读写可以位于同一个进程,也可以位于不同进程,如父子进程。

2.1K20

linux内核中听过就能记住概念

刚才说匿名管道和命名管道都算一种。除此之外,还有:信号,消息队列,共享内存,信号量和套接。不用头疼,看到最后你很可能会有豁然开朗感觉,学东西终于可以串在一起了。   ...一个句柄就是你给一个文件,设备,套接(socket)或者管道一个名字,以便帮助你记住你证处理名字,并隐藏某些缓存等复杂性。说白了就是文件指针啦。   文件描述符:内核利用文件描述符来访问文件。...打开现存文件新建文件时,内核返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写文件。...文件描述符形式上是非负整数,实际上它是一个索引值,指向内核为每一个进程所维护该进程打开文件记录表。当程序打开一个现有文件或者创建一个新文件时,内核进程返回一个文件描述符。...程序设计中,一些涉及底层程序编写往往围绕着文件描述符展开。但是文件描述符往往值适用于unix,linux这样操作系统。习惯上,标准输入文件描述符是0,标准输出是1,标准错误是2.

72320

Linux进程间通信之管道

注意: 我们进程间通信时,是没必要对磁盘中文件进行操作,所以我们管道没必要与磁盘中文件产生关联。 文件级缓冲区是由操作系统来维护,所以当父进程对其写入时,是不会发生时拷贝。...[0] 管道读端文件描述符 pipefd[1] 管道文件描述符  匿名管道使用: 注意下图中fd均指pipefd。...我们再站在文件描述符角度深入理解: 匿名管道测试:  现在用下述代码测试匿名管道,父进程进行一直读取,子进程进行一直写入: #include #include ...从上图可以算出管道大小为512*8 = 4096节。  命名管道: 刚才介绍匿名管道,只可用于父子进程间通信,如果两个毫不相干进程要实现通信该怎么办呢?接下来就需要介绍一下命名管道了。...mkfifo函数: mkfifo函数用于创建一个命名管道。 mkfifo第一个参数表示要创建命令管道文件,如果不带路径默认再当前文件夹下。 mkfifo第二个参数表示管道文件权限。

8110

linux进程间通信方式有哪些_高级进程通信方式

概览 进程间通信常见方式如下: 管道 FIFO 消息队列 信号量 共享内存 UNXI域套接 套接(Socket) 管道 管道是一种古老IPC通信形式。...} return 0; } 程序中,我们创建了一个管道,父进程关闭了通道,子进程关闭读通道;子进程管道内写入字符串,而父进程从管道中读取字符串并输出。...与管道和FIFO不同,进程可以没有另外一个进程等待读情况下进行。...消息队列与后面介绍UNIX域套接相比,速度上没有多少优势。 信号量 信号量是一个计数器,它主要用在多个进程需要对共享数据进行访问时候。...而信号量实际上常用于共享数据同步访问。共享内存在进程间传递数据非常高效,但是系统没有对访问进行同步,因此还需要另外实现数据访问同步。套接(socket)是应该目前应用最广泛进程间通信方式。

2.5K20
领券