LINUX C

阅读: 评论:0

LINUX C

LINUX C

A7打开文件出现Bad file descriptor问题

问题: 使用open创建文件的时候出现,Bad file descriptor的问题,实际创建了文件,读写这个文件有大几率出现错误。

解决:
原因是因为,用多线程对该磁盘的频繁操作关闭文件描述符,理应该只关闭一次就够了。

下面code:

/*********************串口app任务*****************************/
void *app1(void * arg)
{//1.将指针装换为所需要的数字int * p = (int *)arg;int fd = *p;  //串口标识符int fd_file;  //文件标识符int len = 5;char r_buf[2048]={0};char filename[50]={0};char buf[] = "log gpzda ontime 1r";int i=0; int j=0;int flag = 1;int lenth=0;int ret;while(1){if(sem_status.uart_mode == 0) //不等于1,说明不是UART命令模式{//write(fd, buf, sizeof(buf));		ret = UART_Recv(fd,r_buf, 1024, 2000);//2000if(ret != -1){//第一次进来if(flag == 1){int rand_data = rand()%70;printf("rand  %drn",rand_data);usleep(50000*rand_data);//互斥操作,sem_wait(&sem);set_uart_app(fd,FILE_SD,filename);fd_file = open(filename, O_RDWR | O_CREAT  | O_APPEND );if(fd_file <= 0){perror("file open : ");printf("file open %drn",fd_file);//printf("file error %drn",fd);//return ;flag = 1;}else{flag = 0;}sem_post(&sem);		}//将数据写入文件中P(&sem_file);uart_read_sd_data(fd_file,r_buf,ret);lenth += ret;if(lenth >= 4000){fsync(fd_file);//确保写入磁盘lenth = 0;}//设置LED标志,1 表示正在收数据sem_status.led_status = 1;V(&sem_file);}else{//设置LED标志,0 表示进入休闲模式sem_status.led_status = 1;}}else  //如果进入命令模式,需要退出文件,并且重新递增{if(flag == 0)  //不能一直执行,改关闭文件应该只执行一次,不然会早成打开文件错误的BUG{close(fd_file);//关闭文件}flag = 1;}//usleep(10000000);usleep(100000);}}

本文发布于:2024-01-29 04:59:59,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170647560412867.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:LINUX
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23