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

Linux命名管道方式

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

一、命名管道

1、與匿名管道的關系

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

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

命名管道也只能和有“血緣”的進程進行通信

2、工作原理

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

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

在我們對普通文件進行打開的時候,我們要進行的結構其實是這樣的

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

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

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

4、實現(xià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;
        }
    }

    // 打開命名管道以進行寫入操作
    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");
    }
    // 關閉命名管道
    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];

    // 打開命名管道以進行讀取操作
    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'; // 添加字符串結束符

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

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

    return 0;
}

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

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

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

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

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

與其相關的關鍵元素有以下四個:(頭文件stdarg.h

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

總結

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

相關文章

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

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

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

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

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

    Linux手動部署Oracle JDK 17的完全指南

    本文手把手教你在 Linux 系統(tǒng)上通過官方 tar.gz 壓縮包手動安裝 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軟件架設了FTP服務器,然后我們就可以在虛擬機的Linux下登錄該FTP服務器下載或上傳文件了。
    2011-06-06
  • Linux使用粘滯位 (t-bit)共享文件的方法教程

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

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

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

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

    Linux內存分析工具介紹,高效診斷和解決問題

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

    詳解Linux中的守護進程

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

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

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

    Ubuntu 16.04無法切換root權限問題的解決

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

最新評論

钟祥市| 株洲县| 鱼台县| 辽阳市| 大连市| 南汇区| 门头沟区| 无棣县| 响水县| 磐石市| 景德镇市| 康平县| 稻城县| 襄樊市| 商都县| 汨罗市| 阿瓦提县| 蓬莱市| 华宁县| 蓝山县| 大同县| 浦城县| 云浮市| 弥勒县| 吕梁市| 东山县| 浦江县| 瑞金市| 东源县| 临湘市| 都昌县| 方山县| 丹东市| 沈阳市| 五大连池市| 东方市| 贞丰县| 报价| 荔波县| 庆阳市| 六枝特区|