`
utensil
  • 浏览: 152548 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

POSIX无缓冲文件I/O及可变参数小玩

阅读更多

这段以前写的测试程序包含了对POSIX无缓冲文件I/O、文件加解锁、进程分叉、可变参数的综合运用。没什么技术含量,纯粹记述一下,不想有一天弄丢了。

C真是又小巧又灵活,在语言的犄角旮旯还是存在一些之前完全想不到会有的特性,呵呵~不过,现在可能会从事的这个工作是不是只能用C不能用C++呢?难道真的得告别自己的最爱?

//posix
#include <unistd.h>
#include <sys/types.h> //for pid_t
#include <sys/stat.h>
#include <sys/file.h>
#include <fcntl.h>

//randoming
#include <stdlib.h> //for random
#include <time.h> //for srand with time

//variable parameter list
#include <stdarg.h>

//common
#include <stdio.h>
#include <string.h>

void my_read();
void my_write();

void lock_set(int fd, int type);
void my_lock_test(int n_tests, ...);

int main()
{
    my_read();
    my_write();

    srand((unsigned int)time(0));

    fork();

    my_lock_test(4, F_WRLCK, F_UNLCK, F_RDLCK, F_UNLCK);

    exit(0);
}

void my_read()
{
    int fd;

    if ((fd = open("/tmp/hello.c", O_CREAT|O_TRUNC|O_WRONLY, 0600))<0)
    {
        perror("open:");
        exit(1);
    }
    else
        printf("Openfile:hello.c%d\n",fd);

    if (close(fd)<0)
    {
        perror("close:");
        exit(1);
    }
    else
        printf("Closehello.c\n");
}

void my_write()
{
    int fd, size, len;
    char* buf = "Hello!I'm writing to this file";
    char buf_r[10];
    len = strlen(buf);

    if ((fd = open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0)
    {
        perror("open:");
        exit(1);
    }
    else
        printf("Openfile:hello.c%d\n", fd);


    if ((size = write(fd, buf, len))<0)
    {
        perror("write:");
        exit(1);
    }
    else
        printf("Writes:%s\n", buf);

    lseek(fd, 0, SEEK_SET);

    if ((size=read(fd, buf_r, 10))<0)
    {
        perror("read:");
        exit(1);
    }
    else
        printf("read first 10 characters from file:%s\n",buf_r);

    if (close(fd)<0)
    {
        perror("close:");
        exit(1);
    }
    else
        printf("Closehello.c\n");

}

void lock_set(int fd, int type)
{
    struct flock lock;
    lock.l_whence = SEEK_SET;
    lock.l_start = 0;
    lock.l_len = 0;

    while (1)
    {
        lock.l_type = type;

        if ((fcntl(fd, F_SETLK, &lock))==0)
        {
            if (lock.l_type == F_RDLCK)
                printf("read lock set by %d\n", getpid());
            else if(lock.l_type == F_WRLCK)
                printf("write lock set by %d\n", getpid());
            else if(lock.l_type == F_UNLCK)
                printf("release lock by %d\n", getpid());

            return;
        }

        fcntl(fd, F_GETLK, &lock);

        if (lock.l_type != F_UNLCK)
        {
            if (lock.l_type == F_RDLCK)
                printf("%d: read lock already set by %d\n", getpid(), lock.l_pid);
            else if (lock.l_type==F_WRLCK)
                printf("%d:writelockalreadysetby%d\n",getpid(),lock.l_pid);

            sleep(random()%3);
        }

    }
}

void my_lock_test(int n_tests, ...)
{
    va_list test_cases;
    int cur;

    int fd;
    fd = open("/tmp/hello.c", O_RDWR|O_CREAT, 0666);

    if (fd<0)
    {
        perror("lock test open:");
        exit(1);
    }

    va_start(test_cases, n_tests);
    for (cur = 0; cur < n_tests; ++cur)
    {
        lock_set(fd, va_arg(test_cases, int));

        sleep(random()%5);
    }
    va_end(test_cases);

}
 

 

分享到:
评论

相关推荐

    深究标准IO的缓存

    无缓冲I/O,如使用open和read系统调用,直接对文件进行操作,不进行缓存;带缓冲I/O,如fopen和fwrite,数据首先写入用户空间的缓存区,当缓存区满或者执行fflush时,再将数据写入内核缓冲区,最终由内核将数据写入...

    linux的IO编程

    Linux提供了多种I/O模型,包括同步I/O、异步I/O、阻塞I/O和非阻塞I/O,以及更高级的I/O复用技术如 select、poll 和 epoll。以下是对这些内容的详细阐述: 1. **同步I/O与异步I/O** 同步I/O操作意味着执行I/O操作的...

    C程序优化1.zip_C 优化_优化 c_程序优化

    3. **无缓冲I/O**:使用`open`、`read`、`write`和`close`等低级I/O函数可以绕过标准I/O库的缓冲机制,实现无缓冲I/O。这在需要精确控制I/O操作或处理大量小数据块时特别有用。 4. **预读取和延迟写入**:操作系统...

    Linux系统调用和文件IO.pptx

    它接收三个参数:文件路径、打开模式(如O_RDONLY、O_WRONLY、O_RDWR等)以及可选的文件权限。例如,`O_CREAT`会创建新文件,`O_TRUNC`会清空已存在的文件,`O_APPEND`会将写入内容追加到文件末尾。 2. `creat`函数...

    5种技术处理高TCP并发.zip

    它允许程序监视多个文件描述符,等待至少一个描述符变得可读、可写或遇到错误。然而,select的缺点在于其最大文件描述符数量限制(通常为1024),并且随着文件描述符数量增加,其性能会显著下降。 2. **epoll**: ...

    UNIX环境高级编程_第2版.part1

    书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程  关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在  此基础上介绍了多...

    UNIX环境高级编程_第2版.part2

    书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程  关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在  此基础上介绍了多...

    UNIX环境高级编程-第二版

    ### 知识点总结 ...以上是对《UNIX环境高级编程-第二版》部分内容的知识点概括,涵盖了UNIX的基础概念、标准化及实现细节,以及文件I/O的重要概念和操作方法。这些内容对于深入理解和掌握UNIX编程至关重要。

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

    在高级文件I/O章节,作者介绍了UNIX系统中的一些高级I/O技术,如非阻塞I/O、异步I/O和文件锁,以及如何使用mmap()函数实现文件映射,提高文件访问效率。 #### 错误处理与调试 有效的错误处理和调试能力对于开发高...

    UNIX环境高级编程.

    I/O系统调用是UNIX编程的核心,书中详细阐述了缓冲I/O、非阻塞I/O和异步I/O的实现。 其次,网络编程是现代UNIX环境中不可或缺的一部分。本书详细介绍了套接字API,包括TCP/IP协议栈、UDP通信以及多路复用I/O(如...

    虚拟文件系统

    同时,文件系统的性能优化也是关键,例如缓存策略的设计、减少不必要的磁盘I/O等。此外,为了保证兼容性和可移植性,设计时应遵循标准和最佳实践,例如遵守POSIX标准对于文件系统操作的规定。 总之,虚拟文件系统是...

    UNIX环境高级编程和源代码

    同时,讲解了标准I/O库和低级I/O的区别,以及缓冲I/O的实现。 3. **信号与同步**:深入解析了UNIX中的信号机制,如何处理信号以及同步问题,如互斥锁、条件变量、信号量等。 4. **线程编程**:虽然UNIX早期版本并...

    移植Fatfs文件系统读写SD卡的Keil工程

    它提供了标准的POSIX文件I/O接口,使得在不同的嵌入式平台上实现文件操作变得更加容易。 1. 移植Fatfs: - **配置Fatfs**:移植Fatfs涉及到配置文件`ffconf.h`,在这里定义Fatfs的行为,例如文件系统大小、簇大小...

Global site tag (gtag.js) - Google Analytics