`
brxonline
  • 浏览: 65008 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

UNIX编程(14)-高级IO

    博客分类:
  • C
 
阅读更多

1.非阻塞IO

对于一个给定的描述符有两种方法对其指定非阻塞IO

1)如果调用open获得描述符,则可指定O_NONBLOCK标志

2)对于一个已经打开的描述符,则可调用fcntl由该函数打开O_NONBLOCK文件状态标志

 

#include "apue.h"
#include <errno.h>
#include <fcntl.h>

char    buf[500000];

int
main(void)
{
    int     ntowrite, nwrite;
    char    *ptr;

    ntowrite = read(STDIN_FILENO, buf, sizeof(buf));
    fprintf(stderr, "read %d bytes\n", ntowrite);

    set_fl(STDOUT_FILENO, O_NONBLOCK); /* set nonblocking */

    ptr = buf;
    while (ntowrite > 0) {
        errno = 0;
        nwrite = write(STDOUT_FILENO, ptr, ntowrite);
        fprintf(stderr, "nwrite = %d, errno = %d\n", nwrite, errno);

        if (nwrite > 0) {
            ptr += nwrite;
            ntowrite -= nwrite;
        }
    }

    clr_fl(STDOUT_FILENO, O_NONBLOCK); /* clear nonblocking */

    exit(0);
}

 

2. 记录锁

 

记录锁锁定文件中的一个区域

 

#include <fcntl.h>

int fcntl(int filedes, int cmd, ... /* struct
 flock *flockptr */ );

 

Returns: depends on cmd if OK (see following), 1 on error

 

 

cmd is F_GETLK, F_SETLK, or F_SETLKW

 

struct flock {
     short l_type;   /* F_RDLCK, F_WRLCK, or F_UNLCK */
     off_t l_start;  /* offset in bytes, relative to l_whence */
     short l_whence; /* SEEK_SET, SEEK_CUR, or SEEK_END */
     off_t l_len;    /* length, in bytes; 0 means lock to EOF */
     pid_t l_pid;    /* returned with F_GETLK */
   };

 

例:加锁和解锁一个文件区域的函数

#include "apue.h"
#include <fcntl.h>

int
lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)
{
    struct flock lock;

    lock.l_type = type;     /* F_RDLCK, F_WRLCK, F_UNLCK */
    lock.l_start = offset;  /* byte offset, relative to l_whence */
    lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
    lock.l_len = len;       /* #bytes (0 means to EOF) */

    return(fcntl(fd, cmd, &lock));
}

 

 

锁的隐含继承和释放

1)

2)

3)

4)

建议性锁和强制性锁

 

3.STREAMS

1)putmsg和putpmsg函数

2)ioctl

3)写至流

4)写模式

5)getmsg和getpmsg函数

6)读模式

 4.IO多路转接

 

#include <sys/select.h>

int select(int maxfdp1, fd_set *restrict readfds,
           fd_set *restrict writefds, fd_set
*restrict exceptfds,
           struct timeval *restrict tvptr);

 

Returns: count of ready descriptors, 0 on timeout, 1 on error

 

 

#include <sys/select.h>

int pselect(int maxfdp1, fd_set *restrict readfds,
            fd_set *restrict writefds, fd_set
 *restrict exceptfds,
            const struct timespec *restrict tsptr,
            const sigset_t *restrict sigmask);

 

Returns: count of ready descriptors, 0 on timeout, 1 on error

 

#include <poll.h>

int poll(struct pollfd fdarray[], nfds_t nfds, int
timeout);

 

Returns: count of ready descriptors, 0 on timeout, 1 on error

 

 

5.异步IO

6.readv和writev函数

7.readn和writen函数

 

8存储映射IO

 

 

#include <sys/mman.h>

void *mmap(void *addr, size_t len, int prot, int
flag, int filedes,
           off_t off );

 

Returns: starting address of mapped region if OK, MAP_FAILED on error

 

 

例:用存储映射IO复制文件

#include "apue.h"
#include <fcntl.h>
#include <sys/mman.h>

int
main(int argc, char *argv[])
{
    int         fdin, fdout;
    void        *src, *dst;
    struct stat statbuf;

    if (argc != 3)
        err_quit("usage: %s <fromfile> <tofile>", argv[0]);

    if ((fdin = open(argv[1], O_RDONLY)) < 0)
        err_sys("can't open %s for reading", argv[1]);

    if ((fdout = open(argv[2], O_RDWR | O_CREAT | O_TRUNC,
      FILE_MODE)) < 0)
        err_sys("can't creat %s for writing", argv[2]);

    if (fstat(fdin, &statbuf) < 0)   /* need size of input file */
        err_sys("fstat error");

    /* set size of output file */
    if (lseek(fdout, statbuf.st_size - 1, SEEK_SET) == -1)
        err_sys("lseek error");
    if (write(fdout, "", 1) != 1)
        err_sys("write error");

    if ((src = mmap(0, statbuf.st_size, PROT_READ, MAP_SHARED,
      fdin, 0)) == MAP_FAILED)
        err_sys("mmap error for input");

    if ((dst = mmap(0, statbuf.st_size, PROT_READ | PROT_WRITE,
      MAP_SHARED, fdout, 0)) == MAP_FAILED)
        err_sys("mmap error for output");

    memcpy(dst, src, statbuf.st_size); /* does the file copy */
    exit(0);
}

 

 

分享到:
评论

相关推荐

    UNIX环境高级编程-005_标准IO库

    《UNIX环境高级编程》是一本深入探讨UNIX系统编程的电子书,共分为23个部分,涵盖19章。在这一章中,作者主要讲解了标准I/O库,这是一个在多个操作系统上广泛实现的库,由ANSI C标准定义。标准I/O库的设计目的是简化...

    《UNIX环境高级编程》中文版 Advanced programming in the unix

    这些章节的内容构成了一个全面的UNIX编程学习框架,不仅适合有经验的开发者深化理解,也适合初学者系统地学习UNIX环境下的高级编程技术。通过深入学习这些知识,开发者可以更好地利用UNIX系统资源,编写高效且可靠的...

    高级网络编程课件--东南大学

    此外,课程还覆盖了异步非阻塞编程模型,例如IO多路复用和事件驱动编程,这些技术对于开发高并发和高性能的网络应用至关重要。 网络异常处理和安全性是课程中的重要环节。学生将学会如何优雅地处理网络异常,例如...

    unix环境高级编程

    - **Unix编程环境**:包括但不限于编译器、调试器、链接器等工具,以及shell脚本编写能力。 #### 二、C语言在Unix中的应用 - **C语言基础**:介绍C语言的基本语法、数据类型、控制结构等内容。 - **C语言与Unix ...

    UNIX环境高级编程

    UNIX环境高级编程是一本专注于C语言编程的高级书籍,主要涉及UNIX系统的深层次使用和编程技巧。本书不仅涵盖了UNIX系统的文件结构、IO库等基础知识,而且深入探讨了进程管理、进程间通讯等高级话题。UNIX系统是多...

    [Unix编程环境]_EN.pdf

    - **高级特性**:探讨非阻塞IO、多路复用等高级网络编程技术。 ### 结论 本书《Unix编程环境》是一本经典的参考书籍,不仅适合初学者入门学习,也适合有一定基础的开发者深入研究。通过学习这本书,读者可以全面...

    UNIX环境高级编程01

    10. **12高级IO.pdf**: 高级I/O通常涉及非阻塞I/O、异步I/O和多路复用技术,如select、poll和epoll,这些都是处理大量并发连接的关键技术。 通过这些章节的学习,读者可以掌握在UNIX环境中进行高效编程所需的高级...

    UNIX环境高级编程_第二版

    中文名: UNIX环境高级编程 原名: UNIX环境高级编程 作者: W.Richard Stevens / Stephen A.Rago译者: 尤晋元 / 张亚英 ...第12章高级IO 第13章精灵进程 第14章进程间通信 第15章高级进程间通信 第16章数据库函数库 .....

    Unix环境高级编程.doc

    ### Unix环境高级编程知识点 #### 1. 程序结束返回值 - **返回值范围**:在Unix环境中,程序结束时...通过以上知识点,我们可以了解到Unix环境下的一些核心概念和技术细节,这对于深入理解和掌握Unix编程至关重要。

    武大UNIX环境高级编程2019年考试题目(考后回忆版).doc

    **UNIX 环境高级编程知识点** 1. **空洞文件**:空洞文件是一种特殊类型的文件,其中数据部分...这些是针对“武大UNIX环境高级编程2019年考试题目”所涵盖的主要知识点,对于深入理解UNIX编程原理和实践具有重要意义。

    unix环境高级编程及源码

    理解C语言的基础语法、内存管理和指针操作是Unix编程的基础。 2. **系统调用**:Unix提供了一组系统调用接口,允许程序员与操作系统内核进行交互。例如,`open()`用于打开文件,`write()`用于写入数据,`fork()`...

    UNIX环境高级编程(上).rar

    12 高级IO.pdf 13 精灵进程.pdf 14 进程间通信.pdf 15 高级进程间通信.pdf 16 数据库函数库.pdf 17 与PostScript 打印机通信.pdf 18 调制解调器拨号器.pdf 19 伪终端.pdf 20 附录A 函数原型.pdf 21 附录B ...

    unix高级程序编程的全部的实验

    6. **错误处理**:在Unix编程中,良好的错误处理能力至关重要。学会使用errno、perror和strerror来报告和诊断错误,以及如何编写健壮的异常处理代码。 7. **标准库和工具**:熟练使用标准C库中的函数,如内存管理...

    java高级特性 - io流.pdf

    Java IO流是Java编程中处理输入输出流的高级特性,其目的是为了提供一个统一的方式来处理不同类型的数据,如文本文件、二进制文件等。Java的IO流是设计来实现数据传输的,主要使用java.io包下的各种类和接口。本篇...

    unix network programming(Volume 1 • Third Edition).pdf

    9. 网络编程的高级主题:包括IO多路复用、select和poll系统调用的使用、网络文件系统(NFS)的高级特性、网络地址转换(NAT)和网络负载均衡等。 10. 与其他编程语言的接口:虽然本书主要聚焦于使用C语言进行UNIX网络...

Global site tag (gtag.js) - Google Analytics