freebsd(or solaris)에서의 read함수 문제
제가 linux에서 open으로 파일을 열어 read함수를 이용해서 특정 파일을 1바이트씩 읽어들이도록 하였습니다.
리눅스는 잘 되던데..
freebsd에서 그렇게 하니까 "File too large"라는 에러가 뜨더라구요..( 2,3 바이트들도 마친가지.. )
하는수없이 read가 읽어들이는 사이즈값을 엄청 높게 잡아서 에러는 면했는데..
fopen과 fgets등을 이용하면 읽어들이는 사이즈가 적어도 에러가 안나던데요..
제가 truss로 fopen&fgets 으로 처리하는것과 open&read로 처리하는 시스템콜을 비교하였는데 잘 모르겠더라구요..
왜 프비나 솔라리스에서는 리눅스처럼 1,2바이트씩 파일을 읽어들이면.. 그러한 문제점이 생기는 것일까요..
해결 방법좀 부탁드립니다..
참고로 읽은 파일은 /proc/~~/map 이었습니다.
아래는 간단한 소스입니다.
#include
#include
#include
#include
#include
#include
int main( void )
{
int count=0;
int fd;
char ch[2]={0x00,};
char gpt[128]={0x00,};
int gp;
off_t r;
gp = getpid();
sprintf( gpt , "/proc/%d/map" , gp );
printf("%s\n",gpt);
fd = open( gpt , O_RDONLY );
if( fd == -1 )
{
perror( "open" );
return -1;
}
while( ch[0] != '\n' )
{
lseek( fd , count++ , SEEK_SET );
r= read( fd , ch , 1 );
if( r == -1 ) { perror( "read" ); exit(1); }
return count;
}
FreeBSD 에서는 한번에
FreeBSD 에서는 한번에 전체를 읽도록 하나봅니다. 버퍼가 너무 작으면 EFBIG 를 내준다고
하네요.
다음이 설명입니다. (sys/fs/procfs/procfs_map.c)
댓글 달기