• linux高性能服务器编程第六章高级IO函数 (1)


    Linux提供的高级IO函数, 自然是特定条件下能力更强, 不然要他干啥, 特定条件自然限制了他的使用频率 文件描述符 文件描述符在是一个非负整数。是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。 STDOUT_FILENO(值为1)- 值为1的文件描述符为标准输出, 关闭STDOUT_FILENO后用dup即可返回最小可用值(目前为, 1) 这样输出就重定向到了调用dup的参数指向的文件

    创建文件描述符 - pipe dup dup2 splice select

    pipe函数 这个函数可用于创建一个管道, 实现进程间的通信.

    // 函数定义
    // 参数文件描述符数组 fd[0] 读出 fd[1]写入 单向管道
    // 成功返回0, 并将一对打开的文件描述符填入其参数指向的数组
    // 失败返回-1 errno
    #include <unistd.h>
    int pipe(int fd[2]);
    // 双向管道
    // 第一个参数为 协议PF_UNIX(书上是AF_UNIX)感觉这里指明协议使用PF更好一些
    #include <sys/types.h>
    #include <sys/socket.h>
    int socketpair(int domain, int type, int protocol, int fd[2]);

    学习了后面的内容了解到了进程间通信, 回来补上一个例子

    int main()
    {
        int fds[2];
        socketpair(PF_UNIX, SOCK_STREAM, 0, fds);
        int pid = fork();
        if (pid == 0)
        {
            close(fds[0]);
            char a[] = "123";
            send(fds[1], a, strlen(a), 0);
        }
        else if (pid > 0)
        {
            close(fds[1]);
            char b[20] {};
            recv(fds[0], b, 20, 0);
            printf("%s", b);
        }
    }

    dup和dup2函数 复制一个现有的文件描述符

    #include <unistd.h>
    // 返回的文件描述符总是取系统当前可用的最小整数值
    int dup(int oldfd);
    // 可以用newfd来制定新的文件描述符, 如果newfd已经被打开则先关闭
    // 如果newfd==oldfd 则不关闭newfd直接返回
    int dup2(int oldfd, int newfd);

    dup函数创建一个新的文件描述符, 新的文件描述符和原有的file_descriptor共同指向相同的目标. 回来补上例子, 这个例子由于关掉了STDOUT_FILENOdup最小的即为STDOUT_FILENO所以 标准输出都到了这个文件之中

    int main()
    {
        int filefd = open("/home/lsmg/1.txt", O_WRONLY);
        close(STDOUT_FILENO);
        dup(filefd);
        printf("123\n");
        exit(0);
    }
  • 相关阅读:
    Android stadio 插件推荐--ok gradle
    算法:枚举法---kotlin
    Kotlin 二分法算法游戏--猜价格
    android onCreate的两个方法
    Spring 中的scope
    Intellij IDEA 2017 debug断点调试技巧与总结详解篇
    深入浅出ConcurrentHashMap1.8
    ConcurrentHashMap JDK1.8
    synchronized修饰普通方法和静态方法
    Java多线程系列--CopyOnWriteArraySet
  • 原文地址:https://www.cnblogs.com/mjhjl/p/16229110.html
Copyright © 2020-2023  润新知