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

互联网网站设计产品推广营销方案

互联网网站设计,产品推广营销方案,app开发网站开发,一个网站怎么赚钱一、命名管道的定义与用途 定义:命名管道是一种特殊的文件,不同于匿名管道,它有文件名,可在文件系统中看到。用途:解决匿名管道只能在有血缘关系进程(如父子进程或者有共同祖先的进程)间通信的…

一、命名管道的定义与用途

  • 定义:命名管道是一种特殊的文件,不同于匿名管道,它有文件名,可在文件系统中看到。
  • 用途:解决匿名管道只能在有血缘关系进程(如父子进程或者有共同祖先的进程)间通信的限制,允许无血缘关系的进程间通信。

二、命名管道的创建方式

(一)命令行方式

  • 命令mkfifo 管道名,例如mkfifo myFifo
  • 查看属性:使用ll -l命令,管道文件类型标记为p,末尾可能有|符号。
  • 直接读命名管道: 若没有其它进程将数据写入命名管道的操作就会阻塞
  • 直接写命名管道: 若没有其它进程从命名管道读入数据的操作也会阻塞
  • 一个进程读、一个进程写:

    单纯的读或写命名管道都会被阻塞,必需在写操作的时候存在另一个进程在读命名管道才不会被阻塞

(二)编程方式

  • 函数原型int mkfifo(const char *pathname, mode_t mode);
  • 参数说明
    • pathname:命名管道的路径。
    • mode:管道文件的权限(如0666表示读写权限)。
  • 结果:创建一个命名管道文件
  • 返回值:成功返回 0,失败返回 - 1。
  • 代码演示:
    // test1.cpp的代码#include <cstdlib>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <unistd.h>#define FIFO_NAME "/root/test/my_fifo"      // 这里记得改成你自己的路径int main()
    {if(access(FIFO_NAME, F_OK) == -1){// 不存在int ret = mkfifo(FIFO_NAME, 0660);if(ret != 0) {fprintf(stderr, "创建命名管道(%s)失败.\n", FIFO_NAME);exit(-1);}}printf("进程(%d)正在已读的方式打开管道(%s)...\n", getpid(), FIFO_NAME);int fd = open(FIFO_NAME, O_RDONLY);if (fd == -1) {fprintf(stderr, "进程(%d)打开管道 %s 失败\n", getpid(), FIFO_NAME);} else {printf("进程(%d)打开管道 %s 成功\n", getpid(), FIFO_NAME);}
    }
    // test2.cpp的代码#include <cstdlib>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <unistd.h>#define FIFO_NAME "/root/test/my_fifo"  // 这里记得改成你自己的路径int main()
    {if(access(FIFO_NAME, F_OK) == -1) {int ret = mkfifo(FIFO_NAME, 0660);if(ret != 0) {fprintf(stderr, "创建命名管道(%s)失败", FIFO_NAME);exit(-1);}}printf("进程(%d)正在以写的方式打开命名管道(%s)...\n", getpid(), FIFO_NAME);int fd = open(FIFO_NAME, O_WRONLY);if (fd == -1) {fprintf(stderr, "进程(%d)打开管道 %s 失败\n", getpid(), FIFO_NAME);}else {printf("进程(%d)打开管道 %s 成功\n", getpid(), FIFO_NAME);}return 0;
    }
  • 运行结果:
    只运行了读操作


    再运行写操作


三、命名管道的打开模式

(一)阻塞模式(默认)

  • 读模式打开:若没有写进程打开管道,读操作会阻塞。
  • 写模式打开:若没有读进程打开管道,写操作会阻塞。

(二)非阻塞模式(O_NONBLOCK)

  • 组合使用
    • 读模式 + O_NONBLOCK:打开时不阻塞,直接执行后续代码。
    • 写模式 + O_NONBLOCK:打开时不阻塞,直接执行后续代码。

四、命名管道的读写特性

(一)读操作特性

  • 若无数据可读,读操作阻塞,直到有数据写入。
  • 若管道写端被关闭,读操作返回 0。

(二)写操作特性

  • 若管道已满,写操作阻塞,直到有空间可用。
  • 若管道读端被关闭,写操作会导致错误。
  • 数据长度限制:
    • 若写入数据长度≤PIPE_BUF(通常 4KB),操作原子化,不会与其他写操作交错。
    • 若写入数据长度 > PIPE_BUF,可能部分写入或失败。

(三)管道大小

  • 命名管道的大小为 PIPE_BUF,由系统决定,一般为 4KB。

五、读写数据示例

1、从命名管道中读数据

// test1.cpp的代码
#include <fcntl.h>
#include <limits.h>
#include <linux/limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>#define FIFO_NAME "/root/test/my_fifo"  // 这里记得改成你自己的路径int main()
{if (access(FIFO_NAME, F_OK) == -1) {// 不存在int ret = mkfifo(FIFO_NAME, 0660);if (ret != 0) {fprintf(stderr, "创建命名管道(%s)失败.\n", FIFO_NAME);exit(-1);}}// 以读的方式打开这个命名管道printf("进程(%d)正在以读的方式打开管道(%s)...\n", getpid(), FIFO_NAME);int fd = open(FIFO_NAME, O_RDONLY);if (fd == -1) {fprintf(stderr, "进程(%d)打开管道 %s 失败\n", getpid(), FIFO_NAME);}else {printf("进程(%d)打开管道 %s 成功\n", getpid(), FIFO_NAME);}// 读操作的初始buff全都是 'a'std::string buff(PIPE_BUF, 'a');int  ret   = 0;int count = 0;do {ret = read(fd, buff.data(), buff.size());if (ret < 0) {fprintf(stderr, "读管道失败");exit(1);}count += ret;} while (ret > 0);close(fd);printf("进程(%d)读到 %d 字节\n", getpid(), count);// 读完后,buff全都是 'b'printf("buff = \n%s\n", buff.c_str());return 0;
}

2、从命名管道中写数据

// test2.cpp的代码#include <fcntl.h>
#include <limits.h>
#include <linux/limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>#define FIFO_NAME "/root/test/my_fifo"  // 这里记得改成你自己的路径int main()
{if (access(FIFO_NAME, F_OK) == -1) {// 不存在int ret = mkfifo(FIFO_NAME, 0660);if (ret != 0) {fprintf(stderr, "创建命名管道(%s)失败.\n", FIFO_NAME);exit(-1);}}// 以写的方式打开这个命名管道printf("进程(%d)正在以写的方式打开管道(%s)...\n", getpid(), FIFO_NAME);int fd = open(FIFO_NAME, O_WRONLY);if (fd == -1) {fprintf(stderr, "进程(%d)打开管道 %s 失败\n", getpid(), FIFO_NAME);}else {printf("进程(%d)打开管道 %s 成功\n", getpid(), FIFO_NAME);}std::string buff(PIPE_BUF, 'b');int         total = 10 * 1024 * 1024;int         count = 0;while (count < total) {int ret = write(fd, buff.c_str(), buff.size());if (ret < 0) {fprintf(stderr, "管道写入错误");exit(1);}count += total;}close(fd);return 0;
}

3、运行结果


六、注意事项

  1. 打开同步问题:默认阻塞模式下,单独打开读或写管道会阻塞,需同时有读和写进程配合。
  2. 原子性写入:多个进程同时写入时,确保每次写入数据长度≤PIPE_BUF,避免数据交错。
  3. 权限问题:创建管道时需注意权限设置,确保其他进程有读写权限。
  4. 管道生命周期:命名管道文件在文件系统中持续存在,需手动删除或通过程序处理。

http://www.dtcms.com/wzjs/138704.html

相关文章:

  • 建网站wordpress店铺推广方式有哪些
  • 网站百度统计表格怎么做黄页推广2021
  • 福建福州建设局网站河南公司网站建设
  • 我想建立个网站怎么弄英文网站seo发展前景
  • 怎么样注册自己的网站网站地址ip域名查询
  • 响应式网站什么意思综合型b2b电子商务平台网站
  • logo设计在线生成免费版seo文章
  • 怎么做网站扩展搜索引擎优化的缺点包括
  • python做网站php百度推广托管
  • 网站设计制作电话多少如何做好市场推广
  • 做网管要维护网站百度推广登录网站
  • 做响应式网站的微博号百度指数在线查询工具
  • 中国最大免费h5游戏源码网站百度本地惠生活推广
  • 网站 做购物车网络推广哪家好
  • 镇江网站建设哪家好竞价推广账户竞价托管
  • 长春关键词seo价格seo优化员
  • 网站备案核验点 上海长尾词seo排名
  • 网站建设方面的免费创建网站软件
  • 石家庄网络建站福州网站排名推广
  • 做货代在哪个网站找客源百度seo排名报价
  • 浙江企业在线河南seo排名
  • 网站建设费计入哪个二级科目惠州seo快速排名
  • 品牌好的佛山网站建设价格银徽seo
  • 网站里的内容都是什么作用不受限制的搜索浏览器
  • 建设工程挂网是在那个网站国内专业的seo机构
  • 湛江人做寄生虫网站百度热搜大数据
  • 广州网站建设 推广公司百度快速优化推广
  • 做网站容易还是app容易百度知道提问首页
  • 做室内效果图网站seo北京优化
  • 怎么用记事本做网站仿站定制模板建站