国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

進(jìn)程間通信之利用命名管道進(jìn)行通信

這篇具有很好參考價值的文章主要介紹了進(jìn)程間通信之利用命名管道進(jìn)行通信。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

什么是命名管道

命名管道(Named Pipe),也被稱為FIFO(First In, First Out),是一種在Unix和Unix-like操作系統(tǒng)中用于進(jìn)程間通信的特殊文件類型。它允許不相關(guān)的進(jìn)程通過文件系統(tǒng)中的路徑名進(jìn)行通信。

命名管道的作用有什么

命名管道(Named Pipe)是一種在Unix和Unix-like系統(tǒng)中用于進(jìn)程間通信的特殊文件類型。它的作用主要體現(xiàn)在以下幾個方面:

進(jìn)程間通信: 命名管道提供了一種進(jìn)程間通信的方式。不同的進(jìn)程可以通過共享同一個命名管道文件進(jìn)行通信,其中一個進(jìn)程將數(shù)據(jù)寫入管道,而另一個進(jìn)程從管道中讀取數(shù)據(jù)。這樣,進(jìn)程之間可以實現(xiàn)數(shù)據(jù)的交換和共享。

無關(guān)進(jìn)程通信: 與匿名管道不同,命名管道可以用于無關(guān)的進(jìn)程之間通信。因為命名管道在文件系統(tǒng)中有一個路徑名,進(jìn)程可以通過路徑名來打開和訪問它,而不需要共享相同的地址空間或具有親緣關(guān)系。

獨立于進(jìn)程生命周期: 命名管道是持久的,它存在于文件系統(tǒng)中,不受創(chuàng)建它的進(jìn)程的生命周期限制。這意味著即使創(chuàng)建命名管道的進(jìn)程結(jié)束,其他進(jìn)程仍然可以使用相同的管道進(jìn)行通信。

阻塞式通信: 命名管道是阻塞的,即寫入端會等待讀取端準(zhǔn)備好接收數(shù)據(jù),反之亦然。這樣可以協(xié)調(diào)進(jìn)程之間的通信,確保數(shù)據(jù)的正確傳輸。

常用于Shell編程: 在Shell編程中,命名管道常用于將一個命令的輸出傳遞給另一個命令,實現(xiàn)管道傳輸?shù)耐瑫r也可以用于進(jìn)程間通信。

總體而言,命名管道提供了一種方便、靈活且持久的進(jìn)程間通信機(jī)制,適用于各種需要數(shù)據(jù)交換的場景。

命名管道的特點和用法是什么

文件系統(tǒng)中的路徑名: 命名管道在文件系統(tǒng)中有一個路徑名,類似于普通文件。進(jìn)程可以通過打開這個路徑名的方式來訪問命名管道。

獨立的進(jìn)程通信: 不同進(jìn)程可以通過共享同一個命名管道文件來進(jìn)行通信。這使得命名管道成為不同進(jìn)程之間進(jìn)行進(jìn)程間通信的有效手段。

創(chuàng)建和刪除: 命名管道可以使用 mkfifo 函數(shù)來創(chuàng)建。創(chuàng)建后,它就成為文件系統(tǒng)中的一個特殊文件。當(dāng)通信結(jié)束時,可以使用 unlink 函數(shù)刪除命名管道。

讀寫操作: 進(jìn)程可以像普通文件一樣使用文件描述符對命名管道進(jìn)行讀取和寫入操作,實現(xiàn)進(jìn)程間的數(shù)據(jù)傳輸

命名管道與匿名管道有什么區(qū)別

命名管道(Named Pipe)和匿名管道(Anonymous Pipe)是兩種不同類型的管道,它們在創(chuàng)建、使用和生命周期等方面有一些關(guān)鍵區(qū)別。

命名管道:

創(chuàng)建: 命名管道在文件系統(tǒng)中有一個路徑名,可以通過 mkfifo 函數(shù)創(chuàng)建。它是一個具有持久性的文件,不依賴于創(chuàng)建它的進(jìn)程的生命周期。
路徑名: 命名管道有一個在文件系統(tǒng)中的路徑名,因此可以被不同的進(jìn)程通過路徑名來訪問。
無關(guān)進(jìn)程通信: 不相關(guān)的進(jìn)程可以通過共享同一個路徑名的命名管道進(jìn)行通信。
使用: 通過文件描述符進(jìn)行讀寫操作,可以使用標(biāo)準(zhǔn)的文件I/O函數(shù)。
生命周期: 命名管道存在于文件系統(tǒng)中,直到顯式刪除。
匿名管道:

創(chuàng)建: 匿名管道是由 pipe 系統(tǒng)調(diào)用創(chuàng)建的,沒有在文件系統(tǒng)中的路徑名。它是一種臨時的、僅存在于相關(guān)進(jìn)程之間的通信機(jī)制。
路徑名: 不存在路徑名,只能在創(chuàng)建它的進(jìn)程及其相關(guān)子進(jìn)程之間使用。
有關(guān)進(jìn)程通信: 主要用于有關(guān)系(親緣關(guān)系)的父子進(jìn)程之間通信。
使用: 通過文件描述符進(jìn)行讀寫操作,可以使用標(biāo)準(zhǔn)的文件I/O函數(shù)。
生命周期: 隨著創(chuàng)建它的進(jìn)程或相關(guān)子進(jìn)程的終止而結(jié)束。
綜上所述,主要區(qū)別在于命名管道是具有路徑名的、持久的文件,可以被不相關(guān)的進(jìn)程使用;而匿名管道是臨時的、只存在于相關(guān)進(jìn)程之間的通信機(jī)制,主要用于父子進(jìn)程之間通信。選擇使用哪種管道取決于具體的應(yīng)用場景和需求。

匿名管道相較于命名管道的局限性

首先我們可以先看一下匿名管道的代碼

#include <iostream>
#include <string>
#include <unistd.h>
#include <string.h>
#include <string>
#include <cstdio>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
#define N 2
const int NUM = 1024;
void Write(int n)
{
  string s = "hello,I am chile";
  pid_t self = getpid();
  char buffer[NUM]; // 緩沖區(qū)
  int number = 0;
  while (true)
  {
    buffer[0] = 0; // 字符串清空
    snprintf(buffer, sizeof(buffer), "%s-%d-%d", s.c_str(), self, number++);
    // cout << buffer << endl;
    write(n, buffer, strlen(buffer));
    sleep(1);
  }
}
void Read(int rfd)
{
  char buffer[NUM];

  while (true)
  {
    buffer[0] = 0;
    ssize_t n = read(rfd, buffer, sizeof(buffer));
    if (n > 0)
    {
      buffer[n] = 0;
      cout << "father get a message[" << getpid() << "]# " << buffer << endl;
    }
  }
}

int main()
{
  int pipefd[N] = {0};
  int n = pipe(pipefd);
  if (n < 0)
    return 1;
  pid_t id = fork();
  if (id < 0)
    return 2;
  if (id == 0)
  {
    close(pipefd[0]);

    Write(pipefd[1]);

    close(pipefd[1]);
    exit(0);
  }
  close(pipefd[1]);

  Read(pipefd[0]);
  pid_t rid = waitpid(id, NULL, 0);
  if (rid < 0)
  {
    return 3;
  }
  close(pipefd[0]);

  return 0;
}

從上面代碼我們可以清晰的感知到匿名管道只適用與具有親緣關(guān)系的進(jìn)程之間的通信但是我們在實際開發(fā)環(huán)境中更多的進(jìn)程是不具備親緣關(guān)系的因此匿名管道就非常的局限了。我們看一下匿名管道的最終實現(xiàn)的效果圖
進(jìn)程間通信之利用命名管道進(jìn)行通信,linux,c++,運維,linux,命名管道,進(jìn)程,c++

命名管道如何使用

我們來看一下命名管道的使用效果圖
進(jìn)程間通信之利用命名管道進(jìn)行通信,linux,c++,運維,linux,命名管道,進(jìn)程,c++
在這張圖我們可以清楚的看到右邊輸入左邊輸出達(dá)到了我們想要的無親緣關(guān)系的進(jìn)程的通信

代碼

1.comm.hpp文件文章來源地址http://www.zghlxwxcb.cn/news/detail-805437.html

#pragma once

#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

#define FIFO_FILE "./myfifo"
#define MODE 0664
enum
{
    FIFO_CREATE_ERR = 1,
    FIFO_DELETE_ERR,
    FIFO_OPEN_ERR
};

class Init
{
public:
    Init()
    {
        int n = mkfifo(FIFO_FILE, MODE);
        if (n == -1)
        {
            perror("mkfifo");
            exit(FIFO_CREATE_ERR);
        }
    }
    ~Init()
    {
        int m = unlink(FIFO_FILE);
        if (m == -1)
        {
            perror("unlink");
            exit(FIFO_DELETE_ERR);
        }
    }
};
  1. server.cpp文件代碼
#include "comm.hpp"
#include <iostream>
using namespace std;
int main()
{
    Init init;
    int fd = open(FIFO_FILE, O_RDONLY);
    if (fd < 0)
    {
        exit(FIFO_OPEN_ERR);
    }
    while (true)
    {
        char buffer[1024];
        int len = read(fd, buffer, sizeof(buffer));
        if (len < 0)
        {
            break;
        }
        else if (len > 0)
        {
            buffer[len] = 0;
            cout << "client say#" << buffer << endl;
        }
        else if (len == 0)
        {
            break;
        }
    }
    close(fd);
    return 0;
}
  1. client.cpp的代碼
#include "comm.hpp"
#include <iostream>
using namespace std;
int main()
{
    int fd = open(FIFO_FILE, O_WRONLY);
    if (fd == -1)
    {
        perror("open");
        exit(FIFO_OPEN_ERR);
    }
    else
    {
        cout << "client open file done" << endl;
        while (1)
        {
            cout << "Please Enter@ ";
            string a;
            getline(cin, a);
            write(fd, a.c_str(), a.size());
        }
        }
    close(fd);
    return 0;
}

到了這里,關(guān)于進(jìn)程間通信之利用命名管道進(jìn)行通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux進(jìn)程間通信【命名管道】

    Linux進(jìn)程間通信【命名管道】

    ?個人主頁: 北 海 ??所屬專欄: Linux學(xué)習(xí)之旅 ??操作環(huán)境: CentOS 7.6 阿里云遠(yuǎn)程服務(wù)器 命名管道通信屬于 IPC 的其中一種方式,作為管道家族,命名管道的特點就是 自帶同步與互斥機(jī)制、數(shù)據(jù)單向流通 ,與匿名管道不同的是:命名管道有自己的名字,因此可以被沒有血

    2024年02月08日
    瀏覽(39)
  • 【Linux】進(jìn)程間通信——命名管道

    【Linux】進(jìn)程間通信——命名管道

    匿名管道只能用來進(jìn)行進(jìn)程間通信,讓具有血緣關(guān)系的進(jìn)程進(jìn)行通信 讓毫不相關(guān)的進(jìn)程之間進(jìn)行通信,就需要采用命名管道通信 因為該文件有文件名稱的,而且必須要有,所以叫做命名管道 mkfifo函數(shù) 輸入 man mkfifo 指令 制作一個 FIFOS ,表示命名管道 mkfifo fifo 制作一個管道

    2023年04月15日
    瀏覽(19)
  • 【Linux】進(jìn)程間通信 -- 命名管道 | mkfifo調(diào)用

    【Linux】進(jìn)程間通信 -- 命名管道 | mkfifo調(diào)用

    client.cpp : server.cpp : 然后創(chuàng)建 Makefile 使得我們更方便的去編譯: 這樣我們使用一條指令編譯兩個文件: 我們可以發(fā)現(xiàn)我們創(chuàng)建的 named_pipe 是以 p 開頭而且有自己獨立的 inode ,說明它是一個 獨立的管道文件 我們執(zhí)行下面腳本,主要的功能就是使用 echo 循環(huán)輸出 hello world! 到管

    2024年02月13日
    瀏覽(19)
  • Linux通信--構(gòu)建進(jìn)程通信的 方案之管道(下)|使用匿名管道實現(xiàn)功能解耦|命名管道實現(xiàn)serve&client通信

    Linux通信--構(gòu)建進(jìn)程通信的 方案之管道(下)|使用匿名管道實現(xiàn)功能解耦|命名管道實現(xiàn)serve&client通信

    文章目錄 一、管道的應(yīng)用實例-父進(jìn)程喚醒子進(jìn)程,子進(jìn)程執(zhí)行某種任務(wù) 二、命名管道 1.創(chuàng)建一個命名管道 2.匿名管道與命名管道的區(qū)別 3.命名管道的打開規(guī)則 4.用命名管道實現(xiàn)serverclient通信 后續(xù)將源碼上傳到gitee,上傳后修改鏈接。 管道應(yīng)用的一個限制就是只能具有共同祖

    2024年02月10日
    瀏覽(26)
  • 進(jìn)程間通信-命名管道

    進(jìn)程間通信-命名管道

    ????????先前已經(jīng)了解了匿名管道,但是這是適用于有血緣關(guān)系的進(jìn)程間,如果無血緣關(guān)系的進(jìn)程要實現(xiàn)通信, 此時需要有另一種通信方案-命名管道。為什么命名管道可以用于無血緣關(guān)系的進(jìn)程間通信,什么是命名管道,為什么說它是有名字的,后面我們會一一了解。

    2024年01月20日
    瀏覽(20)
  • 進(jìn)程間通信(命名管道)

    進(jìn)程間通信(命名管道)

    目錄: ?????????? 1.命名管道 ?????????? 2.創(chuàng)建命名管道 --------------------------------------------------------------------------------------------------------------------------------- 1.命名管道 1.管道的一個應(yīng)用限制就是只能在具有共同祖先(具有親緣關(guān)系)的進(jìn)程間通信 2.如果我們想在不相

    2024年02月06日
    瀏覽(19)
  • 學(xué)習(xí)系統(tǒng)編程No.20【進(jìn)程間通信之命名管道】

    學(xué)習(xí)系統(tǒng)編程No.20【進(jìn)程間通信之命名管道】

    北京時間:2023/4/15/10:34,今天起床時間9:25,睡了快8小時,昨天刷視屏刷了一個小時,本來12點的時候發(fā)完博客洗把臉就要睡了,可惜,看到了一個標(biāo)題,說實話,現(xiàn)在的標(biāo)題黨是懂人性的,接下來就是無法自拔的一個小時快樂時光,但導(dǎo)致莫名間接熬夜,你說煩人不煩人!但

    2023年04月17日
    瀏覽(23)
  • 【Linux從入門到精通】通信 | 管道通信(匿名管道 & 命名管道)

    【Linux從入門到精通】通信 | 管道通信(匿名管道 & 命名管道)

    ? ? 本派你文章主要是對進(jìn)程通信進(jìn)行詳解。主要內(nèi)容是介紹 為什么通信、怎么進(jìn)行通信。其中本篇文章主要講解的是管道通信。希望本篇文章會對你有所幫助。 文章目錄 一、進(jìn)程通信簡單介紹 1、1 什么是進(jìn)程通信 1、2?為什么要進(jìn)行通信 ?1、3 進(jìn)程通信的方式 二、匿名管

    2024年02月09日
    瀏覽(19)
  • 【Linux】匿名管道與命名管道,進(jìn)程池的簡易實現(xiàn)

    【Linux】匿名管道與命名管道,進(jìn)程池的簡易實現(xiàn)

    本質(zhì)是先讓不同的進(jìn)程看到同一份資源,也就是兩個進(jìn)程都能對管道文件的緩沖區(qū)進(jìn)行操作 這里我們pipe的時候,會使用兩個文件描述符,這兩個文件描述里面存的file結(jié)構(gòu)體是同一個,也就是管道文件的file結(jié)構(gòu)體,file結(jié)構(gòu)體中存儲有inode以及系統(tǒng)緩沖區(qū),此時fork一個子進(jìn)程

    2024年02月05日
    瀏覽(23)
  • 【Linux】進(jìn)程通信之管道通信詳解

    【Linux】進(jìn)程通信之管道通信詳解

    ?? 作者: 阿潤菜菜 ?? 專欄: Linux系統(tǒng)編程 其實管道通信是Unix中最古老的進(jìn)程間通信的形式了: 管道通信是一種進(jìn)程間通信的方式,它可以讓一個進(jìn)程的輸出作為另一個進(jìn)程的輸入,實現(xiàn)數(shù)據(jù)的傳輸、資源的共享、事件的通知和進(jìn)程的控制。 管道通信分為兩種類型:匿名

    2023年04月19日
    瀏覽(46)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包