问题: 使用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小时内删除。
留言与评论(共有 0 条评论) |