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;
}