message queue & fp 연관문제 입니다..
글쓴이: shiny / 작성시간: 화, 2003/10/14 - 11:55오전
커널에서 메시지 큐를 생성하여 메시지를 송신하면 아래 유저
프로그램에서는 그 메시지를 처리하는 (fp를 이용하여 'back.dat'에 저장하는)
프로그램을 짰는데 문제는 fp를 사용하지 않으면 제대로 동작이 되거든여..
근데 fp를 사용하여 돌려보면 딱 두번만 실행되고 이런 메시지가 나옵니다.
msgrcv error
msgrcv: No message of desired type
물론 백그라운드로 실행되고 있구여..
다른곳에서 에러가 나는지 확인해 봤는데 다 멀쩡하구
꼭 fp만 사용하면 에러메시지가 나오더라구여..
메시지큐와 fp간에 무슨 충돌이 일어나는지.....ㅠ,.ㅠ
고수님들의 답변 부탁드립니다..
#include <stdio.h> #include <ctype.h> #include <string.h> #include </root/linux/include/linux/ipc.h> #include </root/linux/include/linux/msg_song.h> #include </root/linux/include/linux/stat.h> #include </root/linux/include/linux/types.h> #include </root/linux/include/linux/linkage.h> #define MAXDATASIZE 4096 #define END 4 static void quit(char *call, int end) { perror(call); exit(end); } struct umsg { long mtype; char mtext[4096]; }; main() { unsigned char pathfile[256]; char buf[MAXDATASIZE], name[2]; struct umsg mymsg; int size, j=0, i=0; int qid1; FILE *fp; mymsg.mtype = (long)1; if((qid1 = msgget((key_t)1, IPC_CREAT | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)) == -1) { printf("msgget err\n\r"); quit("msgget", 2); } while(1) { if((size = msgrcv(qid1, &mymsg, 4096, (long)1)) == -1) { printf("msgrcv err\n\r"); quit("msgrcv", 3); } else { printf("received\n\r"); printf("mymsg.mtext->%s\n\r",mymsg.mtext); i=0; while(mymsg.mtext[i] != '\0') { buf[i] = mymsg.mtext[i]; i++; } buf[i] = '\0'; printf("buf->%s\n\r",buf); /*******문제제기된 부분*********/ fp = fopen("back.dat","w"); fputs(buf, fp); fclose(fp); /*******************************/ } } }
Forums:
[quote="man msgrcv"] If no message of
버퍼크기를 메시지큐 크기와 일치 시켜보세요.( 혹시나 ^^; )
strncpy도 쓸 수 있겠네요.
최소한의 코드로 줄이면(테스트 안해봐서 아래비스무리하게)
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
답변감사합니다..
답변 정말루 감솨~~~
제가 소스를 잘못올렸군여,,, 버퍼사이즈와 큐사이즈를 같게 했구여..
버퍼를 쓴이유는 계속 메시지큐 포인터를 참조하서 에러가 나는지
확인차 했던겁니다...
그리고 메시지가 항상 4096개가 아니라 최대 4096개고염...
가변하기 때문에
mymsg.mtext[4095] = '\0';
이부분은 소용없을 듯 하네여...
대신
buf[i] = '\0';
를 썼구여..
문제는 왜 fp를 같이 쓰면 안되냐졍..ㅠ,.ㅠ
꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.
혹시나 key값을 다른 데몬이나 시스템이 쓰고 있는지 확인해보세요.그
혹시나 key값을 다른 데몬이나 시스템이 쓰고 있는지 확인해보세요.
그냥봐서는 오류가 없네요. ^^;
어떤 못된 프로세스가 쓰고 있을지도..... ㅎㅎ
mymsg.mtext[4095] = '\0';
는 메시지의 가변과는 상관없습니다. 프로그램의 작동상...... 오류가 발생할 소지는 버퍼의 최대 크기일때까지 널이 없을경우만 발생하므로 막아 준겁니다. (그외에는 널처리가 필요 없어 보이는군요.)그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
[code:1]static void eint1_int(int ir
커널소스입니당..
참고하셔셔 답변 좀 부탁...
꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.
fp만 없으면..
fp만 사용하지 않으면 아주 잘~ 동작되거는여.. 성실하게..
근데 fp만 사용하면 두번 실행후 프로그램 종료...
버퍼 내용을 꼭 파일로 저장해둬야는데 다른방법이
없을까여???? :cry:
꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.
댓글 달기