`

Chapter 14__高级IO

    博客分类:
  • APUE
F# 
阅读更多
struct flock {
    short     l_type;         /* F_RDLCK, F_WRLCK, or F_UNLCK */
    short     l_whence;       /* SEEK_SET, SEEK_CUR, SEEK_END */
    OFF_T     l_start;        /* starting offset relative to l_whence */
    OFF_T     l_len;          /* len == 0 means "until end of file" */
    pid_t     l_pid;          /* Process ID of the process holding the lock, 
                                returned with F_GETLK */
};

关于struct flock,锁的范围是这么算的
(l_whence + l_start) ~ (l_whence + l_start + l_len)
//  不同的系统,对定义的flock结构,可能不同。 

#include <stdio.h>
#include <fcntl.h>
#include <sys/file.h>
#include <stdlib.h>
#include <unistd.h>

void printLockName(int lockType)
{
    printf("lock type = %d\n", lockType);
    switch (lockType)
    {
        case F_RDLCK : printf("lock type is F_RDLCK\n"); break;
        case F_WRLCK : printf("lock type is F_WRLCK\n"); break;
        case F_UNLCK : printf("lock type is F_UNLCK\n"); break;
        default : printf("not lock type !\n"); 
    }
}

void setFlock(struct flock *lock, int type, off_t offset, int whence, off_t len)
{
    lock->l_type = type;
    lock->l_start = offset;
    lock->l_whence = whence;
    lock->l_len = len;
}

int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)
{
    struct flock lock;
    setFlock(&lock, type, offset, whence, len);
    return (fcntl(fd, cmd, &lock));
}

pid_t lock_test(int fd, int type, off_t offset, int whence, off_t len)
{
    struct flock lock;
    setFlock(&lock, type, offset, whence, len);

    if (fcntl(fd, F_GETLK, &lock) < 0)
        printf("fcntl error");

    printLockName(lock.l_type);
    if (lock.l_type == F_UNLCK)
        return 0;

    return lock.l_pid;
}

void putexit(char *p)
{
    printf("%s\n", p);
    exit(1);
}

#include <stdio.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd = open("/home/long/myc/tem.file", O_RDONLY);
    if (fd < 0)
        putexit("open file error!");

    if (lock_reg(fd, F_SETLK, F_RDLCK, 0, SEEK_SET, 0) == 0)
        printf("lock_reg OK\n");

    printf("getpid() = %d\n", getpid());
    sleep(10);
    close(fd);
    return 0;
}

#include <stdio.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd = open("/home/long/myc/tem.file", O_WRONLY);
    if (fd < 0)
        putexit("open file error!");

    int pid = -1;
    pid = lock_test(fd, F_WRLCK, 0, SEEK_SET, 0);
    printf("lock pid = %d\n", pid);

    sleep(10);
    char buf[] = "hello\0";
    if(write(fd, buf, sizeof(buf)) < 0)
        perror("wrire error");

    close(fd);
    return 0;
}
分享到:
评论

相关推荐

    Chapter10_J

    "Chapter10_J"可能涵盖了一些高级主题,旨在帮助开发者提升技能和理解Java的核心概念。 首先,Java的核心特性之一是它的“一次编写,到处运行”(Write Once, Run Anywhere,WORA)理念。这意味着编写的Java代码...

    java_chapter09.rar_Java培训教程

    4. **IO流**:Java的IO流库用于读写数据,包括文件操作、网络通信等。第九章可能涵盖了输入输出流的基本概念,如字节流和字符流,以及缓冲流、对象序列化和文件复制等实际应用。 5. **多线程**:Java提供了内置的多...

    java第14章java-chapter14.rar

    本章将深入探讨Java的第14章,这一章节可能涵盖了Java的高级特性,如多线程、集合框架的深入理解、输入/输出流、网络编程以及可能的异常处理和反射机制。 1. **多线程**:Java中的多线程允许程序同时执行多个任务。...

    chapter7.zip

    本章节我们将深入探讨"chapter7"中的核心概念,这通常涵盖Java编程的高级主题,如多线程、集合框架、IO流以及网络编程等。 首先,多线程是Java中的重要特性,它允许程序同时执行多个任务,提高了程序的效率和响应性...

    java教学Ppt

    6. **Java_Chapter_05.ppt**:最后一章可能涉及更高级的主题,如文件和IO流操作,多线程(线程的创建、同步、死锁),或者深入到反射、注解、枚举等特性,甚至可能介绍Java的泛型和集合框架的高级用法。 学习这套...

    Java高级实用教程

    4. **IO流与NIO**:`Chapter5`可能会涵盖I/O流的基本概念,如字节流和字符流,缓冲流,对象序列化,以及Java NIO(非阻塞I/O)系统,如通道和选择器。 5. **反射机制**:`Chapter6`可能讨论Java的反射机制,如何在...

    vc实例精通源码,windows基本控件的使用Demo

    14_DateTimeDemo 演示日期时间选择控件的使用方法。 15_CalendarDemo 演示日历控件的使用方法。 16_IPCtrlDemo 演示IP输入框的使用方法。 第3章(\Chapter03) 示例描述:本章介绍高级Win32控件的使用方法。...

    chapter10.zip

    在这个压缩包中,"chapter10"可能代表课程或教程的第十个部分,通常这会涵盖更高级或者特定主题的Java知识。以下是一些可能涵盖的Java知识点: 1. **异常处理**:在Java中,异常处理是一个重要的概念,用于捕获和...

    《Linux系统编程、网络编程》 第9章 高级IO

    课程内容:1.非阻塞IO 如何将阻塞的读写设置为非阻塞的读写。2.文件锁 1)使用fcntl函数实现 2)使用flock函数实现3.多路IO select方式,poll方式。 4.异步IO5.存储映射

    C#入门经典(第四版)源码chapter23,32

    Chapter 32可能涉及更高级的主题,如异常处理、文件I/O、网络编程或线程管理。异常处理是C#中的错误处理机制,通过try-catch块捕获并处理运行时错误。文件I/O操作是任何应用程序的基础,用于读写磁盘上的文件。C#...

    《Java语言程序设计(进阶篇)》 课后习题第28章代码chapter28.rar

    《Java语言程序设计(进阶篇)》是深入学习Java编程的一本经典教材,其第28章的课后习题代码着重探讨了Java高级特性和面向对象编程的深度应用。这一章节可能涵盖多线程、网络编程、IO流、异常处理、集合框架以及反射...

    Beginning Visual C# 2005

    578472_Chapter29.zip可能涵盖了高级主题,例如异常处理和事件处理,这是在编写健壮应用程序时必不可少的知识。异常处理允许程序员在遇到错误时优雅地处理,而事件处理则涉及用户界面的交互和响应。 578472_Chapter...

    oracle性能优化求生指南重要脚本

    6. **高级I/O技术(Chapter 22 Advanced IO techniques)** 这部分可能涉及RAID配置、ASM(Automatic Storage Management)、ASH(Active Session History)和其他I/O监控工具,以优化数据读写速度,减少I/O延迟,...

    code-chapter7.rar

    《Java语言程序设计案例教程》第七章主要涵盖了Java编程中的高级特性和实践技巧,这些内容对于深入理解和掌握Java编程至关重要。在这一章中,我们将会探索以下几个关键知识点: 1. **异常处理**:Java的异常处理是...

    代码-Java2实用教程.7z

    14. **Chapter 14:反射** 反射允许程序在运行时检查类的信息并动态调用方法,是Java的高级特性之一。 15. **Chapter 15:高级话题** 这一章可能涵盖枚举、注解、内部类、Lambda表达式、并发库...

    《Java语言程序设计(进阶篇)》 课后习题第22章代码chapter22.rar

    第22章的代码着重讲解了Java的一些高级特性,包括但不限于多线程、集合框架、异常处理、IO流以及反射等。以下是针对这些主题的详细知识点解析: 1. **多线程**:Java提供了一种并发执行任务的能力,主要通过`Thread...

    java第16章java-chapter16.rar

    第16章的学习通常涵盖了Java高级特性和一些实用技术,这些内容对于深入理解和掌握Java至关重要。在这个章节中,我们可以期待学习到以下一系列的知识点: 1. **异常处理**:Java的异常处理机制是程序健壮性的重要...

    java第6章java-chapter6.rar

    Java编程语言是软件开发领域广泛使用的高级编程语言,尤其在企业级应用中占据了主导地位。本章"java-chapter6"聚焦于Java的核心概念和技术,旨在深入理解和掌握Java的精髓。我们将围绕以下几个关键知识点展开讨论: ...

    C#入门经典(第4版)原书源码4

    6. **文件操作与IO流**:"Chapter 29"通常会讲解如何读写文件、使用流进行输入输出操作,这对于任何需要处理外部数据的程序都是必不可少的。 7. **多线程编程**:在某些章节中,可能会讨论并发和多线程,这对于构建...

Global site tag (gtag.js) - Google Analytics