传统管道,匿名管道

2024-09-03 08:36
文章标签 管道 匿名 传统

本文主要是介绍传统管道,匿名管道,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二、传统的进程间通信-管道文件
    管道是UNIX系统中最古老的进程间通信技术,古老意味着所有系统都支持,早期的管道是半双工通信,现有的系统管道是全双工通信
    管道就是一种特殊的文件,数据在文件中是流动的,读取之后就自动消失,如果文件中没有数据则会阻塞
    有名管道:基于有文件名的管道文件的通信
        编程模型
            进程A               进程B
          创建管道             
          打开管道              打开管道
          写数据                读数据
          关闭管道              关闭管道 
          删除管道
        
        创建有名管道文件:
        1、命令 mkfifo
        2、函数
        int mkfifo(const char *pathname,mode_t mode);
        功能:创建有名管道
        pathname:管道文件路径
        mode:管道文件权限 0664

测试结果如下:

1. **使用 fgets 读取输入**:这样可以安全地读取一行输入,避免了缓冲区溢出的问题。 2. **去掉末尾的换行符**: buf[strcspn(buf, "\n")] = '\0'; 这行代码将输入中的换行符替换为字符串结束符,以便后续处理。

2.scanf 函数在默认情况下使用空格、换行符和制表符作为分隔符,因此它不会读取包含空格的字符串。具体来说,当你使用 %s 格式说明符时, scanf 只会读取到第一个空格为止,之后的内容会被忽略。例如:

1.    匿名管道:
        只适合通过fork创建父子进程之间使用
        int pipe(int pipefd[2]);
        功能:创建一个匿名管道文件
        通过pipefd返回该匿名管道文件的读权限fd和写权限的fd
        pipefd[0]   用于读匿名管道
        pipefd[1]   用于写匿名管道
        编程模型:
            父进程              子进程
            获取一对fd
            创建子进程          拷贝\共享一对fd
            关闭读              关闭写
            写数据              读数据
            关闭写              关闭读

#include <stdio.h>
#include<sys/ipc.h>
#include<sys/types.h>
int main(int argc,const char* argv[])
{//创建内存空间int	shmid=shmget(ftok(".",110),4096,IPC_CREAT|0664);if(shmid<0){perror("shmget");return -1;}//映射共享内char* shm=shmdt(shmid,NULL,0);if(shm==(void *)-1){perror("shmat");shmctl(shmid,IPC_STAT,NULL);return -1;}pid_t pid=0;printf("");scanf("%u",&pid);//写数据并通知其他进程for(){printf(">>>");//向shm(内存)中写入scanf("%s",shm);kill(pid,);if(0==strcmp("quit",chm)){printf("通信结束\n");break;}}return 0;
}

测试结果:

这篇关于传统管道,匿名管道的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132527

相关文章

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

Redis 管道的神奇力量

今天我们要来探索一个 Redis 中非常强大且实用的特性——管道(Pipeline)。如果你想让你的 Redis 操作更加高效,那么这篇文章绝对值得一读。 一、Redis 管道是什么 Redis 管道是一种在客户端和服务器之间批量执行命令的技术。它允许客户端将多个命令一次性发送到服务器,而不是逐个发送并等待每个命令的响应。服务器会按照顺序执行这些命令,并将所有命令的响应一次性返回给客户端。

深入探讨生成对抗网络(GANs):颠覆传统的AI创作方式

在人工智能的快速发展中,生成对抗网络(Generative Adversarial Networks, GANs)无疑是一个引人注目的技术。自2014年由Ian Goodfellow等人首次提出以来,GANs已经在图像生成、文本生成、视频生成等多个领域展现出了惊人的能力。本文将详细解析GANs的原理、结构以及应用场景,帮助读者全面理解这一颠覆性的技术。 一、GANs的基本原理 生成对抗网络(G

【JavaScript】方法属性的匿名函数是匿名函数么(附:获取当前执行函数名称的方法)

var ninja = {shout: function(){console.log("hello");}}   有些人可能认为,将匿名函数赋值给名为shout的属性也就相当于给它取了名字,其实这是不正确的理解。shout是属性的名称,而不是函数自身的名称。这一点可以通过检查函数的name属性来验证。 下面是一些测试实例,请自行思考(前两个均为匿名函数):

匿名对象-详解

在 C++ 中,匿名对象通常指的是那些在定义时没有名字的对象。这些对象的生命周期通常是临时的,它们在创建它们的表达式结束后很快就会被销毁。以下是一些 C++ 中匿名对象的例子: 1. **临时对象**:    临时对象是在表达式中创建的,没有名字的对象。它们通常用于函数返回对象时,或者在需要隐式转换时。    std::string getName() {return std::string(

【Linux】Linux 管道:进程间通信的利器

文章目录 Linux 管道:进程间通信的利器1. 什么是管道?2. 管道的分类2.1 匿名管道(Unnamed Pipe)2.2 命名管道(Named Pipe,FIFO) 3. 管道的局限性4. 结论 Linux 管道:进程间通信的利器 在 Linux 系统中,管道(Pipe)是进程间通信(IPC, Inter-Process Communication)的重要机制之一。

android kotlin复习 Anonymous function 匿名函数

1、还是先上个图,新建kt: 2、代码: package com.jstonesoft.myapplication.testfun main(){val count = "helloworld".count()println(count);println("------------------------")var count2 = "helloworld".count(){it ==

【上】java获取requestMapping上所有注解功能实现及取匿名注释类的值及 class com.sun.proxy.$Proxy140 转换出错

java获取requestMapping上所有注解功能实现及取匿名注释类的值及 class com.sun.proxy.$Proxy140 转换出错 1,多人相当然以为类似对象一样直接强转下就可以,结果迎来的是class com.sun.proxy.$Proxy140转换出错【想法很勇敢,现实很骨感】 //Class<A> operatorMappingAnnotationType// 错误

C++:Lambda表达式及匿名函数

C++Lambda表达式及匿名函数 1. 语法2. 语法3. 变量捕获 1. 语法 [ 捕获列表 ] ( 参数列表 ) -> 返回类型 { 函数体 } [OuterVar](int x, int y) -> int{return OuterVar + x + y;} 可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体。 忽略参数列表等价于指定一个空函数列表,

Linux管道式操作命令

Linux管道(Pipe)是一种将一个命令的输出作为另一个命令输入的技术。管道操作符是|。这种机制非常强大,因为它允许你将多个简单的命令组合成复杂的操作,实现数据的流式处理。 以下是一些常见的管道式操作命令的例子: 1. 查找特定进程 使用ps命令列出所有进程,然后用grep命令过滤出特定的进程。 ps aux | grep nginx 这个命令会列出所有与nginx相关的进程。 2