도와주세요!!
쓰래드 두개를 돌아가는 프로그램 입니다.
1쓰래드는 이더넷 통신을 주기적으로 하는 쓰래드
2스래드는 파일은 복사하고 압축하여 압축 파일 전송하는 쓰래드
평상시에는 1번 쓰래드가 통신에는 큰 문제는 없는데 2번 쓰래드에서
파일 복사후 압축을 하는 과정에서 1번 쓰래드가 통신이 안됩니다.
압축 관련하여 fork()함수가 수행 될때 1번 쓰래드가 홀드가 되는것 같은데.
이걸 해결 할수 있는 방법이 뭐가 있을까.?
야래의 코드가 2번 쓰래드에서 파일 복사후 압축하는 함수 입니다.
int nand_comm_file(u8 *SrcFile, u8 *DestFile, u32 iSize) {
char srcfile[100], distfile[100];
int copy_len = 0;
char xz_cmd[128];
int ret = 0;
u32 s1, s2;
pid_t pid;
int status;
struct stat statx;
s1 = gettime1000();
copy_len = nand_copy_file(SrcFile, SrcFile, iSize);
if(copy_len == iSize) {
sprintf(DestFile, "%s.xz", SrcFile);
sprintf(srcfile, "%s/%s", TMP_PATH, SrcFile);
sprintf(distfile, "%s/%s", TMP_PATH, DestFile);
pid = fork();
// printf("fork()=%d\r\n", pid);
switch(pid) {
case -1:
printf("Compress Fault\r\n");
ret = 0;
break;
case 0:
execl("/usr/bin/xz", "xz", "-2", srcfile, (char*)0);
break;
default:
wait((int*)0);
// printf("main Compress Success\r\n");
break;
}
stat(distfile, &statx);
ret = statx.st_size;
if(ret <= 0) {
ret = 0;
}
}
else {
printf("Nand Copy Fail.\r\n");
ret = 0;
}
s2 = gettime1000();
printf("copy to temp, Comprres done.[%s:%d](%u ms)\n", distfile, ret, (s2 - s1));
return ret;
}
한번 이렇게 해보시면 어떨까요?
system, fork 대신에 네트웍으로 송수신하는 프로세스는 그대로 두고
압축을 해야 할때 파일에 특정 파일에 1 이라고 써줍니다
bash로 데몬으로 만들어서 특정파일이 1이라고 읽혀지면 0 으로 바꾸고
압축을 실행하도록 합니다
현재는 문제 발생 원인이 system, fork 라 생각되진 않습니다
단지 system 명령을 사용하기 위해서 fork 를 시켜서 수행시키는 것으로 보이고 그런 경우에도
프로세스 자원을 공유하면서 생기는게 아닐까 유추하기 때문에 완전히 분리해서
동작을 시켜보면 어떨까 하는 것입니다
만약 그래도 문제가 생긴다면 압축만 시키는 부분 네트웍으로 통신하는 부분만 따로 따로 잘라서
부분별로 문제점을 찾아나가는 것도 방법이겠죠
그래서 strace 로그를 보시면 빨리 찾으실것 같았거든요
저는 리눅스 코딩은 초보입니다.
임베디드 시작한지 5개월이거든요.
하지만 PC 에서 특히 thread 쪽은 정말 많이 했네요.
2 cpu, 각각 16 물리코어, 64쓰레드[하이퍼쓰레드] 에서
원할하게 작업을 돌린 적이 있습니다.
[vc++ 사용]
일반적으로 fork 로 순간 생성보다는
원래 초기부터 시작시켜놓고
이벤트나 mutex, semaphore 등을 적절히 사용하여
한 쓰레드에서 다른 쓰레드에게 알려주는 방식을
사용하는 것이 좋고 일반적 입니다.
fileCompressStartEvent 요런 것을 하나 만든 후
setEvent 를 한쪽 쓰레드에서 해주면
다른 쓰레드에서는 waitForSingleObject(fileCompressStartEvent,,)
이런 식으로 블럭된 체로 대기타다가
시그널 셋 되면 압축 시작하면 됩니다.
% 위 코드는 윈도 코드임, 리눅스에서 유사한 함수 있을 것 같음.
일단 strace 로그를 뽑아 보시죠
어디서 멈추는지 정도는 알아야 할거 같습니다
그런데 굳이 계속 fork 를 시켜야 하나요?
빈도수가 얼마나 되는지는 모르겠지만 의외로 fork 에 드는 비용이 비싸기 때문에
자원이 작은 임베디드에서는 특별한 이유가 없으면 fork 사용은 지양하는게 보통입니다