`
brxonline
  • 浏览: 63890 次
  • 性别: 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环境高级编程第二版中文版

    在UNIX环境下进行高级编程涉及多种概念和技术,例如进程控制、信号处理、高级IO、终端控制、数据库调用和网络编程。第二版中文版将会对这些高级概念提供深入的讲解和示例,引导读者从基础理论走向实践应用。 ### ...

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

    《高级网络编程》是东南大学陶军教授主讲的一门课程,主要围绕UNIX网络编程的套接字(Socket)API进行深入讲解。这门课程旨在帮助学生和IT专业人士掌握网络通信的核心技术,以便设计和实现高效、可靠的网络应用程序...

    unix环境高级编程

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

    UNIX环境高级编程

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

    UNIX环境高级编程第二版

    《UNIX环境高级编程》是UNIX编程领域的经典教材,作者是W. Richard Stevens。这本书详细介绍了UNIX环境下的高级编程技术,是学习UNIX系统编程不可或缺的参考书籍。本书不仅适合有经验的程序员,也非常适合编程初学者...

    UNIX环境高级编程第二版.pdf

    文档清晰,被认为是一份非常有价值的资源,适合希望深入学习UNIX编程的人士参考。 - **分享目的**:通过社区分享的形式,让更多人能够接触到这份宝贵的资料,促进学习和交流。 #### 3. 标签理解 - **标签含义**:...

    [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编程原理和实践具有重要意义。

Global site tag (gtag.js) - Google Analytics