• 对于非阻塞命名管道的测试 O_NONBLOCK


    样例代码如下:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main() {
        // 定义命名管道的路径
        const char* pipe_path = "/tmp/my_pipe";
    
        // 创建命名管道
        mkfifo(pipe_path, 0666);
    
        // 打开命名管道进行读写操作
        int pipe_fd = open(pipe_path, O_RDWR | O_NONBLOCK);
    
        // 非阻塞读取命名管道中的数据
        char buffer[1024];
        ssize_t bytes_read;
        while ((bytes_read = read(pipe_fd, buffer, sizeof(buffer))) > 0) {
            std::cout.write(buffer, bytes_read);
            std::cout << "haha" << std::endl;
        }
        printf("bytes_read = %ld, errno = %d\n", bytes_read, errno);
        if (bytes_read == -1 && errno == EAGAIN) {
            perror("Error reading from pipe");
            // return 1;
        }
    
        // 非阻塞写入数据到命名管道
        const char* data_to_write = "Hello, World!";
        ssize_t bytes_written = write(pipe_fd, data_to_write, strlen(data_to_write));
        if (bytes_written == -1 && errno == EAGAIN) {
            perror("Error writing to pipe");
            return 1;
        }
    
        bytes_written = write(pipe_fd, data_to_write, strlen(data_to_write));
        if (bytes_written == -1 && errno == EAGAIN) {
            perror("Error writing to pipe");
            return 1;
        }
    
        while ((bytes_read = read(pipe_fd, buffer, sizeof(buffer))) > 0) {
            std::cout.write(buffer, bytes_read);
            std::cout << "haha" << std::endl;
        }
    
        // 关闭命名管道
        close(pipe_fd);
        unlink(pipe_path);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    经过测试,命名管道的空间还挺大的,使用非阻塞写入可以连续两次写入。

    面对连续多次被写入的命名管道,只要不超出一次读管道的字符限制,一次读管道就能读出所有数据

    如果读的时候命名管道里没有东西,read 系统调用会返回 -1,同时 errno 会被设置成 EAGAIN,告知一段时间后重试

  • 相关阅读:
    PaddleOCR安卓Demo存在的问题
    Spring AI 初学
    计算机毕业设计springboot+vue基本微信小程序的学习资料共享交流小程序
    UDP与TCP:了解这两种网络协议的不同之处
    windows域KCC知识点
    VivadoAndTcl: namespace
    vue中的rules表单校验规则使用方法 :rules=“rules“
    唤醒键盘后无法立即隐藏键盘问题与键盘隐藏的四种方式
    jQuery表单校验jquery.validate.js的使用
    (十二)STM32——NVIC中断优先级管理
  • 原文地址:https://blog.csdn.net/shimly123456/article/details/133241104