最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux命名管道方式

 更新時(shí)間:2025年03月20日 11:14:57   作者:s_little_monster_  
這篇文章主要介紹了Linux命名管道方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、命名管道

1、與匿名管道的關(guān)系

命名管道由mkfifo創(chuàng)建,是一個(gè)文件,打開要用open打開

命名管道與匿名管道之間唯一的區(qū)別就是它們創(chuàng)建和打開的方式不同,其他基本上相同

命名管道也只能和有“血緣”的進(jìn)程進(jìn)行通信

2、工作原理

通過mkfifo創(chuàng)建,會(huì)生成一個(gè)文件,這就是我們的命名管道文件,它的大小為0

可以看到它的第一列為p,說明它是特殊文件

在我們對普通文件進(jìn)行打開的時(shí)候,我們要進(jìn)行的結(jié)構(gòu)其實(shí)是這樣的

其中這個(gè)刷盤的過程就是文件緩沖區(qū)中的數(shù)據(jù)刷新到硬盤上的過程,而我們的fifo文件即命名管道文件是沒有刷盤的,所以數(shù)據(jù)只會(huì)待在文件緩沖區(qū)里,因?yàn)樵贚inux中,多個(gè)進(jìn)程打開同一個(gè)文件所指向的文件緩沖區(qū)只有一個(gè),所以如果此時(shí)再有一個(gè)進(jìn)程以讀方式打開fifo文件,它們之間就會(huì)以文件緩沖區(qū)作為紐帶連接,形成了一個(gè)結(jié)構(gòu),這個(gè)結(jié)構(gòu),與我們以前所講的匿名管道形成的管道結(jié)構(gòu)是一摸一樣的

3、系統(tǒng)調(diào)用接口

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *filename, mode_t mode);
// filename:文件路徑
// mode:文件權(quán)限
// 返回值:如果管道創(chuàng)建成功返回0,如果失敗返回-1并設(shè)置errno

4、實(shí)現(xiàn)兩個(gè)進(jìn)程間通信

  • tests.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

#define FIFO_NAME "myfifo"
#define BUFFER_SIZE 256

int main()
{
    char message[BUFFER_SIZE];

    // 創(chuàng)建命名管道
    if (mkfifo(FIFO_NAME, 0666) == -1)
    {
        if (errno != EEXIST)
        {
            perror("mkfifo");
            return 1;
        }
    }

    // 打開命名管道以進(jìn)行寫入操作
    int fd = open(FIFO_NAME, O_WRONLY);
    if (fd == -1)
    {
        perror("open");
        return 1;
    }

    // 獲取用戶輸入的消息
    while (1)
    {
        printf("Enter a message to send: ");
        fgets(message, BUFFER_SIZE, stdin);
        message[strcspn(message, "\n")] = 0; // 移除換行符

        // 向命名管道寫入消息
        if (write(fd, message, strlen(message)) == -1)
        {
            perror("write");
            close(fd);
            return 1;
        }

        printf("Message sent successfully.\n");
    }
    // 關(guān)閉命名管道
    close(fd);

    return 0;
}
  • testr.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define FIFO_NAME "myfifo"
#define BUFFER_SIZE 256

int main()
{
    int fd;
    char buffer[BUFFER_SIZE];

    // 打開命名管道以進(jìn)行讀取操作
    fd = open(FIFO_NAME, O_RDONLY);
    if (fd == -1)
    {
        perror("open");
        return 1;
    }
    while (1)
    {
        // 從命名管道讀取消息
        ssize_t bytes_read = read(fd, buffer, BUFFER_SIZE - 1);
        if (bytes_read == -1)
        {
            perror("read");
            close(fd);
            return 1;
        }
        buffer[bytes_read] = '\0'; // 添加字符串結(jié)束符

        // 輸出接收到的消息
        if(buffer[0] == 0)  break;
        printf("Received message: %s\n", buffer);
    }
    // 關(guān)閉命名管道
    close(fd);

    // 刪除命名管道
    if (unlink(FIFO_NAME) == -1)
    {
        perror("unlink");
        return 1;
    }

    return 0;
}

二、可變參數(shù)列表

我們后面要借助命名管道來寫一個(gè)日志文件,我們需要用到可變參數(shù)列表的知識(shí),在這里詳細(xì)解釋一下

可變參數(shù)列表允許函數(shù)接受不定數(shù)量和類型的參數(shù),一般在使用時(shí)放到最后面,例如我們前面在進(jìn)程中斷中的函數(shù):

int execl(const char *path, const char *arg, ...);

我們現(xiàn)在有“表”的概念,只要是一個(gè)表,最后一個(gè)元素一定是NULL,來標(biāo)志著這個(gè)表的結(jié)束

與其相關(guān)的關(guān)鍵元素有以下四個(gè):(頭文件stdarg.h

  • va_list :va_list 是一種自定義類型(通常為指針類型),用于聲明一個(gè)變量,該變量將指向可變參數(shù)列表
  • va_start 宏:其作用是初始化 va_list 類型的變量,讓它指向可變參數(shù)列表的第一個(gè)參數(shù)
void va_start(va_list ap, last);
//ap:va_list 類型的變量
//last:可變參數(shù)列表之前的最后一個(gè)固定參數(shù)
  • va_arg 宏:此宏用于從可變參數(shù)列表中獲取下一個(gè)參數(shù),并將 va_list 指針移動(dòng)到下一個(gè)參數(shù)的位置
type va_arg(va_list ap, type);
//ap:va_list 類型的變量
//type:要獲取的參數(shù)的類型
  • va_end 宏:該宏用于結(jié)束對可變參數(shù)列表的訪問,進(jìn)行必要的清理工作
void va_end(va_list ap);
//ap:之前用 va_start 初始化過的 va_list 變量

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • linux中快速列出文件列表的多種方法總結(jié)

    linux中快速列出文件列表的多種方法總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于linux中如何快速列出文件列表的多種方法,分別介紹了walk、os.scandir、tree、find以及l(fā)ocate等方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • SSH的ssh-keygen命令基本用法詳解

    SSH的ssh-keygen命令基本用法詳解

    ssh-keygen可用來生成ssh公鑰認(rèn)證所需的公鑰和私鑰文件,本文為大家詳細(xì)介紹ssh-keygen的基本使用方法
    2018-10-10
  • Linux手動(dòng)部署Oracle JDK 17的完全指南

    Linux手動(dòng)部署Oracle JDK 17的完全指南

    本文手把手教你在 Linux 系統(tǒng)上通過官方 tar.gz 壓縮包手動(dòng)安裝 Oracle JDK 17,涵蓋舊版清理、下載解壓、環(huán)境變量配置、多版本管理及常見問題排查,適用于 Ubuntu / CentOS / Debian 等主流發(fā)行版,需要的朋友可以參考下
    2026-05-05
  • Linux與Windows XP之間使用FTP互傳文件

    Linux與Windows XP之間使用FTP互傳文件

    在Windows下虛擬安裝了Linux,又在Windows XP下用Serv-u軟件架設(shè)了FTP服務(wù)器,然后我們就可以在虛擬機(jī)的Linux下登錄該FTP服務(wù)器下載或上傳文件了。
    2011-06-06
  • Linux使用粘滯位 (t-bit)共享文件的方法教程

    Linux使用粘滯位 (t-bit)共享文件的方法教程

    在 Linux 系統(tǒng)中,共享文件是日常管理和協(xié)作中的常見任務(wù),而粘滯位(Sticky Bit 或 t-bit)是實(shí)現(xiàn)共享目錄安全性的重要工具之一,本文將帶您詳細(xì)了解如何在 Linux 中共享文件并配置粘滯位來保護(hù)共享資源的安全,需要的朋友可以參考下
    2024-12-12
  • 利用logsave如何將命令輸出保存起來

    利用logsave如何將命令輸出保存起來

    logsave命令運(yùn)行給定的命令,并將命令的輸出信息保存到指定的日志文件中。下面這篇文章主要給大家介紹了關(guān)于利用logsave如何將命令輸出保存起來的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05
  • Linux內(nèi)存分析工具介紹,高效診斷和解決問題

    Linux內(nèi)存分析工具介紹,高效診斷和解決問題

    這篇文章主要介紹了Linux內(nèi)存分析工具,高效診斷和解決問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 詳解Linux中的守護(hù)進(jìn)程

    詳解Linux中的守護(hù)進(jìn)程

    這篇文章主要介紹了詳解Linux中的守護(hù)進(jìn)程的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Linux上MySQL通過圖形化界面操作方式

    Linux上MySQL通過圖形化界面操作方式

    本文介紹了MySQL圖形化工具Workbench的優(yōu)勢、安裝與配置流程,并通過多個(gè)實(shí)際操作案例,展示其在數(shù)據(jù)庫查詢與管理中的高效性,總結(jié)指出,Workbench作為官方工具極大提升了開發(fā)和管理效率
    2025-10-10
  • Ubuntu 16.04無法切換root權(quán)限問題的解決

    Ubuntu 16.04無法切換root權(quán)限問題的解決

    root權(quán)限相信對大家來說都不陌生,下面這篇文章主要給大家介紹了關(guān)于Ubuntu 16.04無法切換root權(quán)限問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04

最新評論

密云县| 田阳县| 禄劝| 方正县| 连州市| 莱州市| 泸溪县| 宁津县| 繁昌县| 那坡县| 宣汉县| 波密县| 邵阳市| 黄平县| 务川| 灌云县| 白银市| 三门县| 翼城县| 宁晋县| 楚雄市| 河南省| 图们市| 甘孜| 郑州市| 平舆县| 镇江市| 庆安县| 乡宁县| 诏安县| 林周县| 德令哈市| 罗定市| 海宁市| 阳山县| 综艺| 二手房| 井陉县| 搜索| 海兴县| 石嘴山市|