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 1\r";
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);//2000
if(ret != -1)
{
//第一次进来
if(flag == 1)
{
int rand_data = rand()%70;
printf("rand %d\r\n",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 %d\r\n",fd_file);
//printf("file error %d\r\n",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);
}
}