传统管道,匿名管道

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

相关文章

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux命名管道方式

《Linux命名管道方式》:本文主要介绍Linux命名管道方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、命名管道1、与匿名管道的关系2、工作原理3、系统调用接口4、实现两个进程间通信二、可变参数列表总结一、命名管道1、与匿名管道的关系命名管道由mkf

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 ==