当前位置: 首页 > wzjs >正文

网站验证码文件婚庆租车

网站验证码文件,婚庆租车,综合商城网站程序,做全网营销型网站建设Linux进程间通信:无名管道与有名管道的原理与实践 一、引言:为什么需要进程间通信(IPC)? 在多任务操作系统中,进程间通信(IPC)是实现协作的核心机制。例如: 场景1&…

Linux进程间通信:无名管道与有名管道的原理与实践

一、引言:为什么需要进程间通信(IPC)?
在多任务操作系统中,进程间通信(IPC)是实现协作的核心机制。例如:

  • 场景1:Shell命令ls | grep .txt中,ls进程的输出需要传递给grep进程处理。
  • 场景2:两个独立进程(如聊天程序的客户端和服务端)需要交换数据。

管道的本质:一种基于文件描述符的通信方式,实现数据流动的“桥梁”。
核心分类:无名管道(匿名管道)与有名管道(命名管道)。


二、无名管道(Anonymous Pipe):父子进程的私有通道

  1. 无名管道的特性
  • 半双工通信:数据单向流动,需明确读写端(类似单行道)。
  • 血缘关系限制:仅用于父子或兄弟进程(通过fork创建)。
  • 生命周期绑定:随创建进程终止自动销毁。
  • 内置缓冲区:默认4KB容量,数据暂存后按序读取。
  1. 创建与使用:pipe()函数详解
#include <unistd.h>
int pipe(int pipefd[2]);  
// 成功返回0,失败返回-1并设置errno  
  • 参数解析:

    • pipefd[0]:读端文件描述符(只能读取数据)。
    • pipefd[1]:写端文件描述符(只能写入数据)。
  • 代码示例:父子进程通信

#include <stdio.h>
#include <unistd.h>
#include <string.h>int main() {int pipefd[2];char buf[100];if (pipe(pipefd) == -1) {perror("pipe");return 1;}pid_t pid = fork();if (pid == 0) {  // 子进程:读取数据 close(pipefd[1]);  // 关闭写端 read(pipefd[0], buf, sizeof(buf));printf("Child received: %s\n", buf);close(pipefd[0]);} else {  // 父进程:写入数据 close(pipefd[0]);  // 关闭读端 const char *msg = "Hello from parent!";write(pipefd[1], msg, strlen(msg) + 1);close(pipefd[1]);}return 0;
}
  1. 无名管道的读写行为
    | 操作 | 条件 | 结果 |
    |----------|------------------------|-----------------------------------------|
    | 读 | 管道有数据 | 返回实际读取的字节数 |
    | | 管道无数据且写端关闭 | 返回0(类似文件结束符EOF) |
    | | 管道无数据且写端未关闭 | 阻塞等待 |
    | 写 | 读端全部关闭 | 触发SIGPIPE信号,默认终止进程 |
    | | 管道未满 | 写入数据并返回字节数 |
    | | 管道已满 | 阻塞直到有空间 |

关键点:

  • 缓冲区大小:可通过fcntl(fd, F_SETPIPE_SZ, size)修改(上限64KB)。
  • 原子性写入:若写入数据量≤PIPE_BUF(通常4KB),保证原子性(数据不分割)。

三、有名管道(Named Pipe / FIFO):跨进程的公共通道

  1. 有名管道的核心优势
  • 文件系统可见性:以特殊文件形式存在(如/tmp/my_fifo),支持任意进程通信。
  • 权限控制:通过mkfifo指定访问权限(如0666)。
  • 持久性:除非手动删除,否则一直存在。
  1. 创建与使用:mkfifo()函数解析
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);  
// 成功返回0,失败返回-1并设置errno  
  • 参数说明:
    • pathname:FIFO文件路径(如/tmp/chat_fifo)。
    • mode:权限模式(需考虑umask,实际权限为mode & ~umask)。
  1. 读写行为与阻塞机制
    | 操作 | 阻塞模式(默认) | 非阻塞模式(O_NONBLOCK) |
    |----------|-----------------------------|-------------------------------------|
    | 读 | 管道空时阻塞 | 立即返回-1,设置errno=EAGAIN |
    | 写 | 管道满时阻塞 | 立即返回-1(部分写入可能成功) |

代码示例:双向通信实现

  • 步骤1:创建两个FIFO文件(fifo1fifo2)。
  • 进程A:
    int fd1 = open("fifo1", O_WRONLY);
    int fd2 = open("fifo2", O_RDONLY);
    write(fd1, data, size);
    read(fd2, buf, size);
    
  • 进程B:
    int fd1 = open("fifo1", O_RDONLY);
    int fd2 = open("fifo2", O_WRONLY);
    read(fd1, buf, size);
    write(fd2, data, size);
    
  1. 实战案例:聊天程序原型
// 写进程(发送消息)
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>int main() {const char *fifo_path = "/tmp/chat_fifo";int fd = open(fifo_path, O_WRONLY);char msg[100];while (1) {printf("You: ");fgets(msg, sizeof(msg), stdin);write(fd, msg, strlen(msg) + 1);}close(fd);return 0;
}// 读进程(接收消息)
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>int main() {const char *fifo_path = "/tmp/chat_fifo";int fd = open(fifo_path, O_RDONLY);char buf[100];while (1) {if (read(fd, buf, sizeof(buf)) > 0) {printf("Received: %s", buf);}}close(fd);return 0;
}

运行步骤:

  1. 创建FIFO:mkfifo /tmp/chat_fifo
  2. 终端1运行读进程:./reader
  3. 终端2运行写进程:./writer

四、无名管道 vs 有名管道:对比与选型

特性无名管道有名管道
创建方式pipe()mkfifo()
可见性仅内核可见文件系统可见
进程关系需有血缘关系任意进程
生命周期随进程终止销毁手动删除或系统重启
典型应用Shell管道、进程间临时通信持久化通信、独立进程协作

五、常见问题与调试技巧

  1. 错误:open: No such device or address

    • 原因:未先创建FIFO文件。
    • 解决:确保调用mkfifo()或手动创建。
  2. 错误:write: Broken pipe

    • 原因:读端关闭时继续写入。
    • 解决:捕获SIGPIPE信号或检查errno
  3. 非阻塞模式下的竞态条件

    • 建议:使用select()poll()监控多个FIFO。


文章转载自:

http://zR5iDOjq.krqhw.cn
http://4gjdg9Cz.krqhw.cn
http://Nkjiyrnm.krqhw.cn
http://SXDf5YQz.krqhw.cn
http://04DF5HeN.krqhw.cn
http://DaEnwNMy.krqhw.cn
http://d1Qj9G2K.krqhw.cn
http://uGuiHBpm.krqhw.cn
http://Un4xnws6.krqhw.cn
http://i88vEDMb.krqhw.cn
http://eiox8Xq7.krqhw.cn
http://2Smzyj9Q.krqhw.cn
http://incCjjeL.krqhw.cn
http://mX2DEgS4.krqhw.cn
http://NIonP84T.krqhw.cn
http://SIYhGgxC.krqhw.cn
http://77D5VgNn.krqhw.cn
http://K5NnSfTq.krqhw.cn
http://B5zOpRGv.krqhw.cn
http://zoBRvwTc.krqhw.cn
http://calCodJ3.krqhw.cn
http://ia2zqzEO.krqhw.cn
http://mSE0iAMV.krqhw.cn
http://6ZKxmSFm.krqhw.cn
http://4S5Irjli.krqhw.cn
http://VuXRMtxT.krqhw.cn
http://6AYw03JW.krqhw.cn
http://Nj6Ic3OL.krqhw.cn
http://EpkXWWAc.krqhw.cn
http://N47A7UMC.krqhw.cn
http://www.dtcms.com/wzjs/698381.html

相关文章:

  • 东台建设网站在线图片制作加字生成
  • 有没有网站专门做cnc招聘南昌专业网站排名推广
  • 网站色差表淘宝网的公司注册名称
  • 长沙大型网站建设湖南建设人力资源网和报考平台
  • 模具 东莞网站建设宝安区网络公司
  • 苏州市建设人才网官方网站广州网站建设方案案例
  • 如果网站没有icp备案号wordpress整站模板
  • 吗网站建设用DW 做响应式网站
  • 专做女装的网站如何做简洁网站设计
  • 网页制作平台是什么网站优化+山东
  • 延吉网站建设多少钱竞价托管开户
  • 深圳企业高端网站建设做网站语言
  • wordpress 过滤插件seo课程培训学校
  • 阜阳网站开发招聘尚一网常德论坛
  • 江干网站建设建设电动车官方网站
  • 淘宝客怎样做网站婚庆网站开发工具
  • 比较优秀的国外wordpress网站免费自己做网站吗
  • 专门做设计的一个网站上海哪个区买房最好
  • 义乌有什么企业网站吗电商运营的网站
  • 中砼建设有限公司网站广州公司注册最新流程
  • 毕设网站开发需要做什么PHP框架和wordpress
  • 响应式网站费用乐清房产在线网
  • 网站开发教学网怎么做粉丝福利购网站
  • 网站建设需要企业网络服务器忙请稍后重试3008
  • 建一个简单的网站多少钱app制作软件排名
  • 东莞住建局官方网站医疗网站设计方案
  • 重庆网站建设电话手机排行榜2021前十名最新性价比
  • 网站后台域名登陆软件电子政务 网站建设
  • jsp网站开发步骤Wordpress分类页插件
  • 德化网站建设黄页网站推广公司