블럭지정했을때 읽는거 어케하는지..
블록을 지정했는데 그거 읽기 위해서 fread 를 사용했는데
세크먼테이션 Fault 만 ..^^;;;
고수님들 블록 지정하고 사용하는 방법 좀..컴파일에는
이상이 없는데 ㅠ.ㅠ
#include
#include
#include
#include
int main(void)
{
int fd,print_data=0;
char buf1[10];
FILE *stream;
struct flock data_lock;
data_lock.l_type = F_RDLCK;
data_lock.l_whence = SEEK_SET;
data_lock.l_start = 0;
data_lock.l_len = 10;
// file open
fd = open("test", O_RDWR);
// file locking
if ( fcntl(fd, F_SETLKW, &data_lock) == -1 )
{
fprintf(stderr, "locking failed");
exit (1);
}
print_data = fread(&fd, sizeof(char), 10, stream);
printf("Locking open data %s\n", print_data);
printf("unlocking\n");
// file unlocking
data_lock.l_type = F_UNLCK;
if ( fcntl(fd, F_SETLKW, &data_lock) == -1 )
{
fprintf(stderr, "unlocking failed");
exit (1);
}
close(fd);
exit(0);
}
~
Re: 블럭지정했을때 읽는거 어케하는지..
fopen()으로 했을때는 fread()를 이용하고
open()로 했을때는 read()를 사용하셔야 합니다.
따라서 fread부분이
read (fd, buf1, 10);
이렇게 수정되어야 합니다.
Segmentation fault (core dumped)의 많은 부분이 함수 자체에서보다는
잘못된 String사용에서 발생을 합니다.
님께서 작성하신 소스에도 오류가 있습니다.
일반적으로 printf()는 대부분의 결과물을 그대로 출력을 해줍니다만
숫자값을 문자열로 출력하는데에서도 에러가 발생할 수 있습니다.
즉,
printf ("Locking open data %s\n", print_data);
라는 것은 절대로 잘못된 것입니다.
이유는 print_data는 int형으로 정의를 해 놓았기 때문입니다.
따라서 %s는 %d로 바꾸시던가 의도된 프로그램 코딩에 따라서
printf ("Locking open data %s\n", buf1);
형태가 되어야합니다.
마지막으로 Segmentation fault의 절반 이상이 스트링 관련이라는
것에 주의 하시기 바랍니다.
P.S. 문자열은 마지막이 반드시 '\0'(0x00, NULL)으로 끝나야지만
정확한 읽기 쓰기가 가능합니다.
즉, 읽고자 하는 데이터가 10바이트이라면 버퍼는 11바이트를 할당하고
반드시 bzero (buf1, 11);(or memset (buf1, 0x00, 11);)형태로 버퍼를
clear해준후에 사용하는 것이 정신건강에 도움이 됩니다. ^^;
답변감사드립니다..그런데 ^^:;
답변감사드립니다 fopen하구 fread 하구 같이 사용을 하는지는
몰랐습니다 ^^; 아 그런데 블록을 잡고 나서 사용할려고 하는데
이것은 우선적으로 블록을 잡고 그걸 fread로 읽어야만 되는거 아니예요?
블록에 잡힌 내용만 read하구 write을 할려고 하는데 read로 는
안되네요 제가 잘못했는지 조언 부탁드립니다.블록내에서 화일 접근방법
해깔리네요 ^^;
댓글 달기