欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux下有名管道m(xù)kfifo使用詳解

 更新時(shí)間:2023年07月10日 15:32:20   作者:hsy12342611  
有名管道用于非親緣關(guān)系進(jìn)程之間的通訊,創(chuàng)建有名管道使用到的庫函數(shù)是mkfifo(),這里強(qiáng)調(diào)是庫函數(shù)的原因是,mkfifo同時(shí)也是一個(gè)用戶指令,這篇文章主要介紹了Linux下有名管道m(xù)kfifo使用,需要的朋友可以參考下

Linux下實(shí)現(xiàn)進(jìn)程通信的方式有很多種,今天要說的是有名管道,有名管道比命名管道的優(yōu)勢是可以在任何進(jìn)程之間傳遞數(shù)據(jù)。有名管道通信是依賴于管道文件這種特殊類型文件來進(jìn)行的。

1.mkfifo命令

mkfifo命令可以創(chuàng)建管道文件,例如:

 如上文件類型是p代表的就是管道文件。

2.mkfifo庫函數(shù)

man 3 mkfifo

 mkfifo函數(shù)是glibc庫中實(shí)現(xiàn)的一個(gè)接口,如下利用mkfifo來實(shí)現(xiàn)進(jìn)程之間數(shù)據(jù)傳輸。

server.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <assert.h>
#include <fcntl.h> 
#define FIFO_PATH "./fifo"
int main()
{
    umask(0);
    // 創(chuàng)建管道
    int ret = mkfifo(FIFO_PATH, 0666);  
    // 打開管道
    int fd = open(FIFO_PATH, O_RDONLY);                                                  
    if(fd > 0) {
      char buf[1024] = {0};
      while(1){
        //管道讀取數(shù)據(jù)
        int ret = read(fd, buf, sizeof(buf) - 1);
        buf[ret] = 0;
        if(ret > 0){
            printf("%s", buf);
            fflush(stdout);
        }
        // 客戶端不寫入數(shù)據(jù),則停止讀取
        else if(ret == 0){
            printf("client quit\n");
            break;
        }
        else{
            perror("read filed\n");
            break;
        }
      } 
    }
    close(fd);
   return 0;
}

client.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <assert.h> 
#include <stdlib.h>
#define FIFO_PATH           "./fifo"
#define WRITE_TIMES         5
/*
標(biāo)準(zhǔn)輸入輸出錯(cuò)誤輸出 FILE*:
stdin
stdout
stderr
標(biāo)準(zhǔn)輸入輸出錯(cuò)誤輸出fd:
STDIN_FILENO 0
STDOUT_FILENO 1
STDERR_FILENO 2
*/
int main()
{
    //打開管道
    int fd = open(FIFO_PATH, O_WRONLY);
    char buf[64] = {0};
    int times = 0;
    while(1)
    {
        // 寫入5次
        if (++times > WRITE_TIMES) {
            break;
        }
        printf("please input info :");
        fflush(stdout);
        //從標(biāo)準(zhǔn)輸入獲取數(shù)據(jù)寫入進(jìn)管道。
        ssize_t ret = read(0, buf, sizeof(buf) - 1);
        if(ret > 0){ //將讀取到的數(shù)據(jù)往文件中寫入
          buf[ret] = 0;
          write(fd, buf, sizeof(buf) - 1);
        }
        else {
          perror("read");
        }
    }
    close(fd);
    return 0;
}

Makefile

.PHONY: all
all: server client
server: server.c
	gcc -o $@ $^
client: client.c
	gcc -o $@ $^
.PHONY: clean
clean:
	rm server client fifo -rf

代碼結(jié)構(gòu):

運(yùn)行兩個(gè)server進(jìn)程,兩個(gè)client進(jìn)程

從運(yùn)行結(jié)果看, 兩個(gè)client進(jìn)程往管道寫入5段數(shù)據(jù)信息,兩個(gè)server進(jìn)程從管道讀取數(shù)據(jù),管道有互斥功能,同一時(shí)刻只能有一個(gè)進(jìn)程從管道讀取數(shù)據(jù)。

到此這篇關(guān)于Linux下有名管道m(xù)kfifo使用的文章就介紹到這了,更多相關(guān)Linux mkfifo使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • shell中exit 0和exit 1的區(qū)別有哪些

    shell中exit 0和exit 1的區(qū)別有哪些

    exit1和exit是shell中的兩個(gè)命令,用于退出當(dāng)前的shell進(jìn)程,本文就來介紹一下shell中exit 0和exit 1有哪些區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Shell腳本美化登錄界面裝飾圖(含農(nóng)歷)

    Shell腳本美化登錄界面裝飾圖(含農(nóng)歷)

    這篇文章主要介紹了Shell腳本美化登錄界面裝飾圖(含農(nóng)歷),本文腳本實(shí)現(xiàn)輸出一個(gè)佛祖像和農(nóng)歷日期,需要的朋友可以參考下
    2015-02-02
  • php在linux中可能用到的命令(推薦)

    php在linux中可能用到的命令(推薦)

    下面小編就為大家?guī)硪黄猵hp在linux中可能用到的命令(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Linux 下載百度網(wǎng)盤大文件的方法

    Linux 下載百度網(wǎng)盤大文件的方法

    Linux 下沒有百度網(wǎng)盤客戶端,用瀏覽器下載速度慢得急死人,本文重點(diǎn)給大家介紹Linux 下載百度網(wǎng)盤大文件的方法,需要的朋友參考下吧
    2017-08-08
  • 一個(gè)簡潔的全自動(dòng)安裝LNMP服務(wù)器環(huán)境的Shell腳本分享

    一個(gè)簡潔的全自動(dòng)安裝LNMP服務(wù)器環(huán)境的Shell腳本分享

    這篇文章主要介紹了一個(gè)簡潔的全自動(dòng)安裝LNMP服務(wù)器環(huán)境的Shell腳本分享,本文腳本在生產(chǎn)環(huán)境上使用了一年多,腳本代碼簡單唯美,需要的朋友可以參考下
    2014-12-12
  • Linux shell腳本的建立與執(zhí)行

    Linux shell腳本的建立與執(zhí)行

    今天小編就為大家分享一篇關(guān)于Linux shell腳本的建立與執(zhí)行,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 使用Bash Shell檢查文件是否存在的方法

    使用Bash Shell檢查文件是否存在的方法

    大多數(shù)情況下,可以使用測試命令來對條件進(jìn)行測試。比如可以比較字符串、判斷文件是否存在及是否可讀等等。下面這篇文章就主要介紹了使用Bash Shell檢查文件是否存在的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測

    shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測

    這篇文章主要介紹了shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測,本文給出的腳本使用對比MD5的方法,檢測linux系統(tǒng)文件是否被替換等問題,需要的朋友可以參考下
    2014-12-12
  • Shell編程中while與for的區(qū)別及用法詳解

    Shell編程中while與for的區(qū)別及用法詳解

    在shell編程中經(jīng)常用到循環(huán),常用的循環(huán)有for和while循環(huán)兩種。while循環(huán)默認(rèn)以行讀取文件,而for循環(huán)以空格讀取文件切分文件,本篇就結(jié)合現(xiàn)網(wǎng)的一些使用示例說說二者的用法和區(qū)別
    2016-02-02
  • 一個(gè)強(qiáng)大的網(wǎng)絡(luò)分析shell腳本分享(實(shí)時(shí)流量、連接統(tǒng)計(jì))

    一個(gè)強(qiáng)大的網(wǎng)絡(luò)分析shell腳本分享(實(shí)時(shí)流量、連接統(tǒng)計(jì))

    這篇文章主要介紹了一個(gè)強(qiáng)大的網(wǎng)絡(luò)分析shell腳本分享,此腳本包含實(shí)時(shí)流量統(tǒng)計(jì)、連接統(tǒng)計(jì)強(qiáng)大功能,需要的朋友可以參考下
    2014-12-12

最新評論