【嵌入式应用开发Linux文件IO常用的四种访问方式

2023年 9月 2日 52.7k 0

    在Linux系统中,一切都可以看成"文件",系统中所有的操作都可以通过文件I/O实现,因此,掌握文件常用接口很有必要。

0.前言

     屏幕前的你如果懂得main函数传递参数机制,可以跳过本部分直接看后续内容。

    在正式内容开始前,小编想讲述Linux中main函数传参的机制。

  • linux中main函数抢先看:
int main(int argc , char* argv[])
  • 函数参数说明:

      • int arc:整型,表示传入参数的个数;
    • char* argv[]:字符型数组,表示实际传入的参数,该参数还存在另一种定义方式,即char argv[][];
  • 实际使用样例:

  • 样例函数

#include 

int main(int argc,char*argv[])
{
  	//打印参数个数
  	printf("argc:%d\n",argc);
  	//遍历参数并且打印
  	printf("argv:");
  	for(int i=0;i 0)
    {
      //判断事件方式是否数输入方式
      if(fds[0].revents == POLLIN)
      {
        //数据读取完成后返回
        while(read(fd,&event,sizeof(event))==sizeof(event))
        {
          printf("get event:type=0x%x code=0x%x value=0x%x\n",event.type,event.code,event.value);
        }
      }
    }
    else if(res == 0)
    {
      printf("time out\n");
    }
    else
    {
      printf("poll err\n");
    }

  }
  return 0;
}

异步通知方式

    异步通知方式,文件是以非阻塞方式打开的,在初始化设置完成后,当没有读取到数据时,程序可以干其他的事,读取数据操作并不影响程序的其他操作。看到这儿,大家是不是觉得这种处理方式很类似于单片机的中断处理函数。:smile_cat::smile_cat::smile_cat:

    异步通知方式,使用了信号量,信号量在此处的作用是通知驱动程序是否能够成功读取数据,能够成功读取数据后,驱动就读取数据;否则就将其闲置在一旁。

代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int fd = 0;
struct input_event event;

void my_sig_handler(int sing)
{
  while(read(fd,&event,sizeof(event))==sizeof(event))
  {
    printf("get event:type=0x%x code=0x%x value=0x%x\n",
    			event.type,event.code,event.value);
  }
}

int main(int argc, char const *argv[])
{
  int fd2 = 0;
  int err = 0;
  struct input_id id;
  unsigned int evbit[2];
  int len,res;
  struct input_event event2;

  struct pollfd fds[2];
  nfds_t nfds = 2;
  unsigned int count = 0,flags;
  //判断参数个数是不是2 一个运行参数  一个文件设备
  if (argc != 2)
  {
		printf("Usage: %s \n", argv[0]);
		return -1;
  }

  /* 注册信号处理函数 */
  signal(SIGIO, my_sig_handler);
  /* 打开驱动程序 */
  fd = open(argv[1], O_RDWR | O_NONBLOCK);
  if (fd < 0)
  {
        printf("open %s err\n", argv[1]);
        return -1;
  }

  /* 把APP的进程号告诉驱动程序 */
  fcntl(fd, F_SETOWN, getpid());
  /* 使能"异步通知" */
  flags = fcntl(fd, F_GETFL);
  fcntl(fd, F_SETFL, flags | FASYNC);
    
  while(1)
  {
  	//主进程干的活
    printf("count:%d\n",count++);
    sleep(2);
  }
  return 0;
}

3.小结

    尽管,上文的四种文件访问方式各有优劣,但只要在合适的时机使用就能够发挥其最大效率!

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论