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

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

在向不可写内存写入时,read() 函数的行为会根据文件描述符所代表的文件类型(文件、匿名管道或套接字)而有所不同。以下是对这些差异的详细解释,包括基础概念、相关优势、类型、应用场景以及可能遇到的问题和解决方法。

基础概念

  1. 文件描述符:文件描述符是一个非负整数,用于标识打开的文件或其他输入/输出资源,如管道和套接字。
  2. 不可写内存:指那些没有写权限的内存区域,尝试写入会导致错误。
  3. read() 函数:用于从文件描述符指向的资源中读取数据到缓冲区。

相关优势

  • 统一接口read() 提供了一个统一的接口来处理不同类型的输入资源。
  • 灵活性:可以根据不同的文件描述符类型执行不同的操作逻辑。

类型及应用场景

文件

  • 应用场景:读取配置文件、日志文件等。
  • 行为:如果尝试从不可写的文件描述符读取,通常会返回错误,因为文件本身可能没有打开以供读取。

匿名管道

  • 应用场景:进程间通信(IPC)。
  • 行为:如果管道的一端不可写(例如,因为写入端已关闭),read() 会立即返回 0,表示没有更多数据可读。

套接字

  • 应用场景:网络通信。
  • 行为:如果尝试从一个不可写的套接字读取,通常会阻塞,直到有数据可读或发生错误。

可能遇到的问题及解决方法

问题1:从不可写内存写入导致 read() 失败

原因:尝试向没有写权限的内存区域写入数据,违反了操作系统的权限规则。

解决方法

  • 确保在尝试写入之前检查内存区域的权限。
  • 使用适当的错误处理机制来捕获和处理这类错误。
代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd = open("non_writable_file.txt", O_RDONLY);
    if (fd == -1) {
        perror("Error opening file");
        return 1;
    }

    char buffer[100];
    ssize_t bytesRead = read(fd, buffer, sizeof(buffer));
    if (bytesRead == -1) {
        perror("Error reading file");
        close(fd);
        return 1;
    }

    buffer[bytesRead] = '\0';
    printf("Read %ld bytes: %s\n", bytesRead, buffer);

    close(fd);
    return 0;
}

问题2:匿名管道一端不可写时的 read() 行为

原因:写入端关闭后,读取端会立即收到文件结束标志。

解决方法

  • 在读取前检查管道的状态。
  • 使用 select()poll() 来监控多个文件描述符的状态。
代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    int pipefd[2];
    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    pid_t pid = fork();
    if (pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) { // Child process
        close(pipefd[0]); // Close reading end in child
        write(pipefd[1], "Hello, World!", 13);
        close(pipefd[1]);
        exit(EXIT_SUCCESS);
    }

    close(pipefd[1]); // Close writing end in parent
    char buffer[100];
    ssize_t bytesRead = read(pipefd[0], buffer, sizeof(buffer));
    if (bytesRead == -1) {
        perror("read");
        exit(EXIT_FAILURE);
    }

    buffer[bytesRead] = '\0';
    printf("Read %ld bytes: %s\n", bytesRead, buffer);

    close(pipefd[0]);
    return 0;
}

通过理解这些基础概念和行为差异,可以更好地处理不同类型的文件描述符,并有效地解决相关问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux文件类型

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

3.1K10

【Linux】进程间通信——匿名管道

套接字(Socket):套接字是一种可以在不同主机之间进行进程间通信的机制,可以实现分布式系统间的通信。...,子进程写入端关闭;如果父进程读取,子进程写入,那么就反之: 如果不关文件描述符,会造成文件描述符泄露并且可能会误操作,所以建议关闭 管道的通信是单向的,即父进程或子进程不能对一个管道同时读和写,...在Linux系统中,可以使用以下系统调用接口创建匿名管道: #include int pipe(int pipefd[2]); 该函数会创建一个管道,并将相应的读取和写入文件描述符存储在...: 在进程间通信时,可能会出现以下场景: 管道为空,read会阻塞 管道为满,write会阻塞 管道是有上限,在某些系统下它只能写入64kb的内容,所以当管道写满了,write就会阻塞 管道写端关闭...,读端最终会读到0,表示已经读到文件结尾 管道读端关闭,操作系统会直接杀掉写入的进程 匿名管道特性: 面向字节流 只能通过具有血缘关系比如父子/兄弟的进程使用,常用于父子进程间通信 文件的生命周期随进程

11800
  • C++进程间通信 详解2

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

    83010

    进程间的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.5K30

    进程间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 是用来存放接收数据的缓冲区

    48.9K62

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

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

    1.7K20

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

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

    4.5K30

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

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

    1.5K42

    【linux学习指南】 进程间通信&&匿名管道&&理解管道的本质

    下面是使用 fork() 来共享管道的原理: 首先,父进程创建一个管道: int fds[2]; pipe(fds); 这将创建一个管道,其读端文件描述符存储在 fds[0],写端文件描述符存储在 fds...父进程可以向管道的写端 fds[1] 写入数据。 在子进程中: 子进程关闭管道的写端 fds[1]。 子进程可以从管道的读端 fds[0] 读取数据。...关闭文件描述符: 当一个进程不再需要管道的某个端口时,应该关闭相应的文件描述符。 关闭读端 fds[0] 表示不再从管道读取数据,关闭写端 fds[1] 表示不再向管道写入数据。...这个缓冲区由内核维护,用户进程无法直接访问或修改它。 管道有两个文件描述符: 读端和写端,分别用于读取和写入数据。 管道的缓冲区: 管道的缓冲区大小是固定的,通常是几千字节。...当写端向管道写入数据时,数据会被存储在缓冲区中。 当读端从管道读取数据时,数据会从缓冲区中取出。 读写机制: 写入管道时,如果缓冲区已满,写进程会被阻塞,直到有空间可写。

    8410

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

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

    82230

    Linux进程通信

    管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数,因为管道在文件系统中并不存在对应的文件,所以不支持lseek()等操作。...当读一个写端已经被关闭的管道时,在所有数据都被读取后,read返回0,以指示达到了文件结束处。 向管道中写数据 读端存在时,向管道中写入数据时,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。...参数:sockfd:listen后的文件描述符(socket()建立的);addr:返回Client的IP、端口等信息,确切格式由套接字的地址类别(如TCP或UDP)决定;若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

    进程间通信详解

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

    43020

    进程通信

    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

    IO多路复用selectpollepoll

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

    1.3K21

    【Linux进程间通信】Linux匿名管道详解:构建进程间通信的隐形桥梁

    同时,我们还会探讨管道在并发编程中的表现,分析其在多进程环境下的行为特性,并提供相应的优化策略。...匿名管道 匿名管道是Linux中一种非常基础的进程间通信(IPC)方式,其本质上是一种内存级的文件,专门用于父子进程间或具有亲缘关系的进程间的通信 创建匿名管道 #include //功能:创建一无名管道 //原型 int pipe(int fd[2]); //参数 //fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端 //返回值:成功返回0,失败返回错误代码...read返回值为0,表示读到文件结尾 读端关闭,写端一直写入,0S会直接杀掉写端进程,通过想目标进程发送SIGPIPE(13)信号,终止目标进程 写端关闭代码示例:(C++): if(id == 0)...命名管道、消息队列、共享内存、信号量以及套接字等多种IPC方式,各自拥有独特的优势和适用场景。

    13110

    CSAPP 网络编程 笔记

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

    58030

    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

    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
    领券