04通信ソケットとしてのlibeventライブラリの下のfifo

04通信ソケットとしてのlibeventライブラリの下のfifo

以下是关于libevent学习的相关文章:
01 libeventライブラリのダウンロードとインストール、およびインストールが成功したかどうかのテスト02libeventライブラリ
の全体的なフレームワークの考え方03libevent
での通信の主な機能
04libeventライブラリでのfifoは通信ソケットとして使用されます05libevent
ライブラリでの保留中と非保留の解釈
06libeventでの通信でのバッファイベントのバッファリングエリア機能
はじめに07libeventライブラリ関連のbuffereventイベントの機能
08libeventライブラリ通信サーバーとクライアントの主な機能
09libeventライブラリサーバーとクライアントTCP通信プロセスとコード例

はじめに:ここでこの例を準備する理由は、libeventライブラリがネットワーク通信、つまりソケットによって返されるfdで使用できるだけでなく、fifoによって返されるローカルソケットなど、ローカルで返されるソケットでも使用できることを示すためです。 fdに加えて、ローカルソケットはファイル、mmap、シグナルなどにすることもできます。

次のコードの前提を理解してください
。1)パイプ:パイプは一方向のデータフローです。一方が読み取りを行っている場合、もう一方は確実に書き込みを行っています。
2)リーダーでパイプが作成された後、現在のパスにはパイプファイル名が付けられ、ライターはパイプを作成する必要はなく、開くだけです。
3)テストするときは、最初に読み取り側を開始します。これは、コードの読み取り側でパイプの作成を制御するためです。もちろん、書き込み側でパイプを作成することもできます。

1コードの読み取り

//read_fifo
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <event2/event.h>

// 读取回调函数  
void read_cb(evutil_socket_t fd, short what, void *arg)
{
    
    
    // 读管道
    char buf[1024] = {
    
    0};
    int len = read(fd, buf, sizeof(buf));
    printf("data len = %d, buf = %s\n", len, buf);
    printf("read event: %s", what & EV_READ ? "Yes" : "No");//对what类型对判断
}

int main(int argc, const char* argv[])
{
    
    
	//存在则删除文件;若删除有进程打开该文件,则等进程关闭后再删除
    unlink("myfifo");
    
    //创建有名管道
    mkfifo("myfifo", 0664);
    
    // open file
    int fd = open("myfifo", O_RDONLY | O_NONBLOCK);
    if(fd == -1)
    {
    
    
        perror("open error");
        exit(1);
    }

    // 乐高底座
    struct event_base* base = NULL;
    base = event_base_new();

    // 创建事件,EV_PERSIST代表持续监听,不写表示只监听一次读事件
    struct event* ev = NULL;
    ev = event_new(base, fd, EV_READ | EV_PERSIST, read_cb, NULL);

    // 添加事件
    event_add(ev, NULL);

    // 事件循环
    event_base_dispatch(base);

    // 释放资源
    event_free(ev);
    event_base_free(base);
    close(fd);
    
    return 0;
}

2終了コードを書く

//write_fifo.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <event2/event.h>

// 回调函数
void write_cb(evutil_socket_t fd, short what, void *arg)
{
    
    
    // write管道
    char buf[1024] = {
    
    0};
    static int num = 666;
    sprintf(buf, "hello, world == %d\n", num);
    write(fd, buf, strlen(buf)+1);
}


int main(int argc, const char* argv[])
{
    
    
	//写端无需再创建管道
	
    // open file
    int fd = open("myfifo", O_WRONLY | O_NONBLOCK);
    if(fd == -1)
    {
    
    
        perror("open error");
        exit(1);
    }

    // 写管道
    struct event_base* base = NULL;
    base = event_base_new();

    // 创建事件,该事件为监听管道fd的写事件,但需添加到base才生效
    struct event* ev = NULL;
    ev = event_new(base, fd, EV_WRITE , write_cb, NULL);

    // 添加事件
    event_add(ev, NULL);

    // 事件循环
    event_base_dispatch(base);

    // 释放资源
    event_free(ev);
    event_base_free(base);
    close(fd);
    
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_44517656/article/details/108761581