zoukankan      html  css  js  c++  java
  • linux 下串口独占方式打开

    参考文章: http://blog.csdn.net/rl529014/article/details/51336161

         http://blog.csdn.net/lin_fs/article/details/7804494

         http://blog.csdn.net/querdaizhi/article/details/7478169

       以flock函数打开设备文件打开,是独占整个文件


      int fd;
    char com_name[20]={0}; sprintf(com_name,"/dev/ttyS100%d",com_port); // sprintf(com_name,"/dev/ttyS%d",1); // printf("before first open "); fd = open(com_name, O_RDWR|O_NOCTTY|O_NDELAY); // fd = open(com_name, O_RDWR|O_EXCL,0444); if (fd < 0) { perror("open serial port"); return(-1); } if(flock(fd,LOCK_EX|LOCK_NB)==0) { printf("the file was not locked. "); } else { printf("the file was locked. "); close(fd); return -1; } if (fcntl(fd, F_SETFL, 0) < 0) { perror("fcntl F_SETFL "); } if (isatty(STDIN_FILENO) == 0) { perror("standard input is not a terminal device"); } return fd;

     以fcntl方式打开设备文件:

      

    int fd;
    
        char com_name[20]={0};
        sprintf(com_name,"/dev/ttyS100%d",com_port);
        // sprintf(com_name,"/dev/ttyS%d",1);
        // printf("before first open
    ");
        fd = open(com_name, O_RDWR|O_NOCTTY|O_NDELAY);
        // fd = open(com_name, O_RDWR|O_EXCL,0444);
        if (fd < 0)
        {
                perror("open serial port");
                return(-1);
        }
        // printf("first open
    ");
    
    
        struct flock lock;
        lock.l_type=F_WRLCK;
        lock.l_pid=getpid();
        lock.l_whence=SEEK_SET;
        lock.l_start=0;
        lock.l_len=0;
    
    
        fcntl(fd,F_GETLK,&lock);
        
    
        if(lock.l_type != F_UNLCK){
             // printf("%d
    ", lock.l_type);
             return -1;
        }
    
    
    
        lock.l_type=F_WRLCK;
        lock.l_pid=getpid();
        lock.l_whence=SEEK_SET;
        lock.l_start=0;
        lock.l_len=0;
    
        if(fcntl(fd, F_SETLKW,&lock) < 0){
             perror("fcntl F_SETLKW
    ");
        }
    
    
        
        if (isatty(STDIN_FILENO) == 0)
        {
            perror("standard input is not a terminal device");
        }
        
        return fd;

      

     F_SETLKW 与  F_SETFL的区别是如果有其他锁阻止该锁被建立,则调用进程进入睡眠状态,等待该锁释放。一旦这个调用开始了等待,就只有在能够进行加锁或者收到信号时才会返回。

    而且F_SETFL设置方式为fcntl(STDOUT_FILENO,F_SETFL,flags),而非fcntl(fd, F_SETLKW,&lock),无法建立锁机制。    F_SETFL 与 F_SETLKW 使用差别比较大

      

  • 相关阅读:
    TCP的三次握手和四次挥手理解及面试题
    linux网卡配置文件参数
    linux的常用指令和配置文件
    django中的modelform和modelfoemset
    django中的form表单验证
    php快速开发的学习经历
    一个微信支付商场的经历
    https的学习过程
    使用java访问elasticsearch创建索引
    写博客是为什么
  • 原文地址:https://www.cnblogs.com/hzijone/p/6128868.html
Copyright © 2011-2022 走看看