Linux高级IO

来源:互联网 发布:费迪南德拳击 知乎 编辑:程序博客网 时间:2024/06/04 15:10

dupdup2函数:用于标准输入输出的重定向

实例:基本的CGI服务器

/* 主要部分:从建立连接之后开始  @connfd 服务器开启监听之后接受连接的描述符   服务器输出到标准输出的内容直接被客户端获得。*/if( connfd < 0 ) //错误描述{    printf( "errno is : %d\n", errno); }else{    close( STDOUT_FILENO ); //关闭标准输出
    dup( connfd );//复制文件描述符,dup总是返回系统中最小的可用文件描述符,就是标准输出。    printf( "abc\n" );    close( connfd );
}

mmapmunmap函数:用于申请/释放一段内存空间。可用做进程间通信的共享内存,也可以将文件直接映射到其中。splice函数:用于在两个文件描述符之间移动数据(零拷贝)实例:零拷贝的回射服务器

/* 主要部分:从建立连接之后开始
  @connfd 服务器开启监听之后接受连接的描述符*/if( connfd < 0 ) //错误描述{    printf( "errno is : %d\n", errno); }else{    int pipefd[2];    ret = pipe( pipefd ); //创建管道    assert( ret != -1 );
ret = splice( connfd, NULL, pipefd[1], NULL, 32768, SPLICE_F_MOVE | SPLICE_F_MORE );//前后两个文件描述符至少有一个是管道 assert( ret != -1 );
ret = splice( pipefd[0], NULL, connfd, NULL, 32768, SPLICE_F_MOVE | SPLICE_F_MORE);//前后两个文件描述符至少有一个是管道
    assert( ret != -1 );    close( connfd );
}

tee函数:在两个管道文件描述符之间复制数据(零拷贝)实例:实现Linux下tee程序(同时输出数据到终端和文件的程序)

/* tee程序:同时输出数据到终端和文件的程序  @filefd 要写入的文件描述符*/{    int filefd = open( argv[1], O_CREAT | OWRONLY | O_TEUNC, 0666 );    assert( filefd > 0 );   int pipefd_stdout[2];
    int ret = pipe( pipefd_stdout ); //创建管道
    assert( ret != -1 );
    int pipefd_file[2];
    int ret = pipe( pipefd_file ); //创建管道
    assert( ret != -1 );
    ret = splice( STDIN_FILENO, NULL, pipefd_stdout[1], NULL, 32768, SPLICE_F_MOVE | SPLICE_F_MORE );//前后两个文件描述符至少有一个是管道
    assert( ret != -1 );    ret = tee( pipefd_stdout[0], pipefd_file[1], 32768, SPLICE_F_NONBLOCK ); //前后两个文件描述符必须都为管道    assert( ret != -1 );
ret = splice( pipefd_file[0], NULL, filefd, NULL, 32768, SPLICE_F_MOVE | SPLICE_F_MORE);//前后两个文件描述符至少有一个是管道 assert( ret != -1 ); ret = splice( pipefd_stdout, NULL, STDOUT_FILENO, NULL, 32768, SPLICE_F_MORE | SPLICE_F_MOVE ); assert( ret != -1 ); close( filefd ); close( pipefd_stdout[0] ); close( pipefd_stdout[1] ); close( pipefd_file[0] ); close( pipefd_file[1] ); return 0;}


                                             
0 0
原创粉丝点击