arm6410,linux,c语言,read函数返回-1,错误:bad address

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm6410,linux,c语言,read函数返回-1,错误:bad address相关的知识,希望对你有一定的参考价值。

采用串口通信,部分代码如下:
int nread,i=0 ;
while(i<10)

char *myBuff2="#000000#000000#000000#000000T000\r\n";
char myBuff4[]="#222222#222222#222222#222222T222\r\n";

if ((nread = read(fd,myBuff2,strlen(myBuff2)))>0)

printf("nLen %d\n",nread);
memcpy(myBuff4, myBuff2, strlen(myBuff2));
printf("hello\n");
printf("%s\n",myBuff4);
printf("hi\n");

else

printf("出错啦!\n");
perror("read:");

i++;

1、可以事先检查一下传递给 read() 函数的 fd 是否合法,即在 'if ((nread = read(fd,myBuff2,strlen(myBuff2)))>0)' 之前判断 if ( fd == NULL ) printf("出错啦!\n");
2、read()函数是文件操作函数,在c语言中很重要。
函数的返回值如下:
(1)如果成功,返回读取的字节数;
(2)如果出错,返回-1并设置errno;
(3)如果在调read函数之前已是文件末尾,则返回0
参考技术A 可以事先检查一下传递给 read() 函数的 fd 是否合法, 即在 'if ((nread = read(fd,myBuff2,strlen(myBuff2)))>0)' 之前判断 if ( fd == NULL ) printf("出错啦!\n");本回答被提问者采纳 参考技术B 应该先调用 open 函数

if( fd = open(“路径名”,O_WRONLY) == -1)


perror("open failed");


这样保证你的fd 参数才是有效的;

然后 char *myBuff2="#000000#000000#000000#000000T000\r\n"; 是有问题的,

myBuff2 指针指向的是只读的数据段,不可以修改, 你把它变成数组
char myBuff2[]="#000000#000000#000000#000000T000\r\n"; 就没问题了

示例:

#include <stdio.h>
#include <fcntl.h>
int main(int argc, char *argv[])

int nread,i=0 ;
int fd;

if( fd = open("./hello.c",O_WRONLY) == -1)

perror("open failed");
return -1;

printf("open success \n");
while(i<10)

char *myBuff2="#000000#000000#000000#000000T000\r\n";
char myBuff4[]="#222222#222222#222222#222222T222\r\n";

if ((nread = read(fd,myBuff4,strlen(myBuff2)))>0)

printf("nLen %d\n",nread);
memcpy(myBuff4, myBuff2, strlen(myBuff2));
printf("hello\n");
printf("%s\n",myBuff4);
printf("hi\n");

else

printf("出错啦 !\n");
perror("read:");

i++;

return nread;
参考技术C 上步连接出错了,感觉该是没连上,你就去读写了,描述符不对

C语言用read封装/实现一个readline函数,读取文件一行 or 最后一行

注意,readline函数可以在windows和linux下通用,但是linux和windows下的空行表示有所区别,下面封装的read_last_line只适用于Linux操作系统。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>

/* 读取fd的一行内容 */
ssize_t readline(int fd, char *buf, ssize_t maxlen)

	ssize_t count = 0;
	memset(buf, '\\0', sizeof(buf));
	
	char *ptr = buf;
	char tmp = 0;
	while(1)
		read(fd, &tmp, sizeof(char));
		if(tmp == '\\n' || tmp == '\\0')		break;
		
		(*ptr) = tmp;
		ptr ++;
		count ++;
		if(count >= maxlen)
			printf("Out of buffer!\\n");
			return -1;
		
	
	return count;	



/* 读取实际有内容的最后一行 */
ssize_t read_last_line(int fd, char *buf, ssize_t maxlen)
	if(fd < 0)	return -1;
	if( lseek(fd, 0, SEEK_END) == 0 ) 
		printf("空文件\\n");
		return -1;
	

	lseek(fd, -1, SEEK_CUR);	
	char tmp = '\\0';
	while(lseek(fd, -1, SEEK_CUR) > 0)
		read(fd, &tmp, sizeof(char));
		if(tmp == '\\n')		break;
		else	lseek(fd, -1, SEEK_CUR);
	
	
	ssize_t offset;
	while((offset = readline(fd, buf, maxlen)) != -1)
		if(offset > 0)	return offset;
		else if( offset == 0 )
			lseek(fd, -2, SEEK_CUR);	
			tmp = '\\0';
			while(lseek(fd, -1, SEEK_CUR) > 0)
				read(fd, &tmp, sizeof(char));
				if(tmp == '\\n')		break;
				else	lseek(fd, -1, SEEK_CUR);
			
			continue;
		
	
	return -1;

int main()
	int fd = -1;
	fd = open("t.txt", O_RDONLY);
	if( fd == -1 )
		printf("failed~!\\n");
	
	
	char readbuf[1024] = 0;
	read_last_line(fd, readbuf, sizeof(readbuf));
	printf("最后一行:%s\\n",readbuf);	

	close(fd);
	return 0;
	
	
 

以上是关于arm6410,linux,c语言,read函数返回-1,错误:bad address的主要内容,如果未能解决你的问题,请参考以下文章

FriendlyARM Tiny6410-Fedora14-QtSDK-Qt4.7交叉编译环境的建立

Linux-2.6.39在Tiny6410上的移植 - 外设驱动移植

ok6410[000] 搭建裸机开发环境

linux下c语言编程read()函数的问题

ok6410[001] Ubuntu 16.04[64bit]嵌入式交叉编译环境arm-linux-gcc搭建过程图解

第五章 搭建S3C6410开发板的测试环境