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

合肥建设厅网站建设一个一般网站需要多少钱

合肥建设厅网站,建设一个一般网站需要多少钱,怎么建设网站服务器,动地科技登录网站命名管道(Named Pipe)是一种在操作系统中用于进程间通信(IPC) 的机制,它允许不相关的进程(甚至不同用户的进程)通过一个可见的文件系统路径进行数据交换。与匿名管道(仅存在于内存&a…

命名管道(Named Pipe)是一种在操作系统中用于进程间通信(IPC) 的机制,它允许不相关的进程(甚至不同用户的进程)通过一个可见的文件系统路径进行数据交换。与匿名管道(仅存在于内存,且只能用于父子进程间通信)不同,命名管道有一个持久化的文件系统入口,因此适用范围更广。

核心特性

  1. 文件系统可见性
    命名管道在文件系统中以特殊文件的形式存在(类型为 p,可通过 ls -l 查看),路径通常由用户指定(如 /tmp/my_pipe)。进程通过打开该路径来连接管道。

  2. 双向或单向通信
    支持半双工(默认,数据单向流动)或全双工(需特殊配置)通信,具体取决于打开方式(读/写模式)。

  3. 阻塞特性

    • 若进程以只读模式打开管道,会阻塞直到另一个进程以写模式打开它。
    • 若进程以只写模式打开管道,会阻塞直到另一个进程以读模式打开它。
    • 读写操作也可能阻塞(如管道为空时读操作阻塞,管道满时写操作阻塞)。
  4. 跨进程通信
    可用于任意进程间(包括无亲缘关系的进程、不同用户的进程,甚至跨网络的进程,如通过 NFS 共享的命名管道)。

命名管道的创建与使用(以 Linux 为例)

1. 命令行创建(mkfifo)

通过 mkfifo 命令可直接在文件系统中创建命名管道:

mkfifo /tmp/my_named_pipe  # 创建命名管道
ls -l /tmp/my_named_pipe   # 查看类型(显示为 p 开头)
# 输出示例:prw-r--r-- 1 user user 0 8月 10 10:00 /tmp/my_named_pipe
2. 编程创建(C 语言)

使用 mkfifo() 系统调用在程序中创建:

#include <sys/stat.h>  // 包含 mkfifo 声明int main() {const char *pipe_path = "/tmp/my_pipe";mode_t mode = 0666;  // 权限:允许读写// 创建命名管道,成功返回 0,失败返回 -1if (mkfifo(pipe_path, mode) == -1) {perror("mkfifo failed");return 1;}return 0;
}

进程通信示例(读写操作)

命名管道的通信流程通常是:一个进程写数据,另一个进程读数据,通过文件操作函数(openreadwriteclose)实现。

写进程(发送数据)
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {const char *pipe_path = "/tmp/my_pipe";const char *msg = "Hello from writer!";// 以只写模式打开管道(O_WRONLY)int fd = open(pipe_path, O_WRONLY);if (fd == -1) {perror("open failed");return 1;}// 向管道写入数据write(fd, msg, strlen(msg));printf("Writer sent: %s\n", msg);close(fd);  // 关闭管道return 0;
}
读进程(接收数据)
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {const char *pipe_path = "/tmp/my_pipe";char buf[1024];ssize_t bytes_read;// 以只读模式打开管道(O_RDONLY)int fd = open(pipe_path, O_RDONLY);if (fd == -1) {perror("open failed");return 1;}// 从管道读取数据bytes_read = read(fd, buf, sizeof(buf)-1);if (bytes_read > 0) {buf[bytes_read] = '\0';  // 手动添加字符串结束符printf("Reader received: %s\n", buf);}close(fd);  // 关闭管道return 0;
}

运行方式

  1. 先运行读进程(会阻塞等待写进程连接)。
  2. 再运行写进程(发送数据后,读进程会立即接收并输出)。

关键注意事项

  1. 管道生命周期
    命名管道的文件系统入口在创建后会一直存在,直到被 unlink()rm 命令删除。即使所有进程关闭管道,文件路径仍保留。

  2. 阻塞与非阻塞
    默认情况下,openreadwrite 操作会阻塞。若需非阻塞模式,可在 open 时添加 O_NONBLOCK 标志:

    int fd = open(pipe_path, O_RDONLY | O_NONBLOCK);  // 非阻塞读
    
  3. 数据传输特性

    • 数据是流式的(无消息边界),读进程需自行处理数据分割(如约定换行符为结束标志)。
    • 数据一旦被读取就会从管道中移除,不会像普通文件那样保留。
  4. 权限控制
    创建时的 mode 参数(如 0666)会结合进程的 umask 确定最终权限,需确保通信进程有足够的读写权限。

  5. 与匿名管道的对比

    特性命名管道(Named Pipe)匿名管道(Anonymous Pipe)
    存在形式文件系统中的特殊文件内存中的文件描述符
    通信范围任意进程(包括无亲缘关系)仅限父子/兄弟进程
    创建方式mkfifo()mkfifo 命令pipe() 系统调用
    持久性管道文件持久存在,直到删除进程退出后自动销毁

应用场景

  • 命令行工具间的通信(如 mkfifo 结合 catecho 等命令)。
  • 后台服务程序与前端程序的交互(如服务器进程接收客户端命令)。
  • 日志收集(多个进程向管道写入日志,一个进程统一处理)。

命名管道是一种简单高效的 IPC 机制,适用于需要跨进程传递流式数据的场景,但其功能相对基础,复杂场景可能需要结合消息队列、共享内存等其他 IPC 方式。

http://www.dtcms.com/a/604957.html

相关文章:

  • 麻省理工学院未来研发更高温超导体打开了新路径
  • Android studio修改app 桌面logo和名称
  • 【MCU控制 初级手札】2.1 电学基础知识 【电学基础】
  • C#1113变量类型
  • RabbitMq消费消息遇到的坑
  • SAP FICO应付账款账龄分析表
  • Pinia Store 生命周期与状态持久性详解
  • 大数据时代时序数据库选型指南:为何Apache IoTDB是最优解
  • 做网站的一个专题在线上传图片生成链接
  • 图论专题(三):“可达性”的探索——DFS/BFS 勇闯「钥匙和房间」
  • 图论专题(一):Hello, Graph! 掌握“建图”与“遍历”的灵魂
  • 做彩票网站能挣到钱吗中国最好的购物平台
  • 南京做网站群的公司岳西县住房和城乡建设局网站
  • 前端高频面试题之Vue(高级篇)
  • 【附源码】告别静态密码!openHiTLS 开源一次性密码协议(HOTP/TOTP),推动动态认证普及
  • UniApp 小程序中使用地图组件
  • 25华北理工大学考情数据分析
  • Unity Shader Graph 3D 实例 - 基础的模型贴图渲染
  • 17.TCP编程
  • Java高级特性:单元测试、反射、注解、动态代理
  • python机器学习工程化demo(包含训练模型,预测数据,模型列表,模型详情,删除模型)支持线性回归、逻辑回归、决策树、SVC、随机森林等模型
  • 逻辑回归在个性化推荐中的原理与应用
  • 织梦网站后台怎么登陆郑州知名做网站公司有哪些
  • 免费做网站的软件跨境电商自建站平台
  • 本机oracle连接延时41970 毫秒
  • 不到一块钱的带USB 2.4G收发 SOC芯片,集成2.4G射频 32位MCU
  • Ubuntu 24.04 安装 PostgreSQL
  • 数据科学每日总结--Day18--数据库
  • 【ZeroRange WebRTC】WebRTC 基于 STUN 的 srflx 直连原理与实现
  • neovim等模态编辑器最优雅的输入法解决方案