LINUX C - 打开文件出现Bad file descriptor问题

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);

	}
	
}
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农-老七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值