fork 에서 파일 공유 관련 질문입니다.
글쓴이: kjh2959 / 작성시간: 수, 2004/05/05 - 11:16오전
fork를 이용해서 부모 프로세스와 자식 프로세스 간에 파일을 공유해서 한쪽에서는 쓰고 한쪽에서는 읽어서 출력하는 류의 프로그램을 짜고 있습니다;;
qna를 찾아보니 보통의 경우는 파일 하나를 열어서 fork한다음 자식이 파일에 쓰고 부모가 읽어서 출력하는 류의 경우가 대부분인데요.
부모가 문자를 입력받아서 파일에 적으면, 자식이 그 파일을 읽어서 출력을 시켜야 합니다;;;
부모가 문자를 입력받아서 파일에 적었다는걸 자식이 기다리게 만들수 있는지요?
Forums:
음...저도 위와 같은 문제를 푼적이 있습니다..학교 리포트였죠...
음...저도 위와 같은 문제를 푼적이 있습니다..
학교 리포트였죠...
위와 같은 문제는 동기화 문제인거 같은데 맞나요?
저는 그때 문제에 접근하길...스레드를 이용해서 접근했습니다..pthread요...
거기보면 동기화를 지원하는 함수들이 있거덩요..
pthread_mutex_lock 이라든지..
pthread_cond_wait 라든지...
스레드 쪽에서만 해봐서...프로세스간에 통신을 하기 위해선...message나 pipe를 이용한다고 들었는데..
저도 초보라 확실히는 잘 모르겠네요...
암튼...위와 같은 경우에서는 fork를 이용하신다면..
우선 static으로 공유변수 만드시고...
message나 IPC쪽을 찾아보심이...(저도잘모름...)주절주절...^^;
If you can dream it,
you can do it
아 저도 학교 리포트 입니다 근데 아직 스레드라던가 동기화 등등을
아 저도 학교 리포트 입니다
근데 아직 스레드라던가 동기화 등등을
안갈켜줬어요;;; 그냥 아는 범위내에서 해결하라는거 같은데요....
message나 pipe라는게 있는거 같은데 어떻게 쓰는지도 모릅니다 ㅠㅠ 아직 잘 알지도 못하거든요...
오호...
제가 아는 한도내서 기본적으로 설명해 드리죠..
우선 공유하는 변수는 임계구역이란 표현을 써서 한번에 하나의 프로세스만이 접근할 수 있도록 해야겠죠..
이것이 첫번째 유의사항이고요...
글쓰신거에서는 판별이 안되는데...순차적으로
쓰고 읽고 쓰고 읽고 이러는 건가요?
만약 이렇다면 구현이 훨~~~씬 쉬워집니다..
뭐 대충 이런식으로 구현하는 것으로 알고 있는데...물론 스레드에서 입니다..
프로세스간의 통신에서도 마찬가지로 알고 있습니다.
예를 들어서 두개의 프로세스가 동시에 실행되고 있다고 해보죠..
첫번째 프로세는 write 이고 두번째 프로세스는 read라면..
우선 write가 먼저 실행이 되겠지요..그담은 read가 실행되는 거구요
두개의 실행구역을 무한루프로 만들구요...이구역에서 계속 뺑뺑이 돌리는 거죠..(책을 찾아보시면 무슨소린지 아실거예염..)
그러면서 간의 작업에 동기화를 부여하는 거구요...
저도 semaphore공부하면서 배운지식인데요..
semaphore로 검색 해보세요...아니면 message라든지..
많은 도움되실것임...
제가 올린 글도 한번 보시고요...그게 semaphore 입니다.^^;
If you can dream it,
you can do it
전역변수만 만들어도 되죠.
check라는 전역변수를 잡아서...
자식이 데이터를쓰면 그 전역변수를 바꿔주면 되죠.
부모는 check 변수를 확인해서 바뀌었으면, 자식이 데이터를 쓴거라 생각하고 출력하면 됩니다.
아니면 시그널이나 다른방법도 있죠.
그냥 파이프 쓰는게 가장 일반적일텐데요... 그리고, 일반적인 전역변수는
그냥 파이프 쓰는게 가장 일반적일텐데요... 그리고, 일반적인 전역변수는 부모/자식간에 전혀 상관없는 완전히 틀린 메모리에 놓이기 때문에 자식의 변경사항을 부모가 알 수 없습니다. (반대도 마찬가지구요.)
간단하게 시그널을 사용하시는 것이 좋지 않을까 하는데요?자식 프로
간단하게 시그널을 사용하시는 것이 좋지 않을까 하는데요?
자식 프로세스에서 시그널 핸들러로 전역변수 하나를 Flag를 set하는
루틴을 만들고, Main Path에서는 Flag를 보고 while()루프를 돌다가
부모 프로세스에서 시그널을 보내면 Flag를 Set하여 while() 루프를 빠져
나오는 식의 방법으로 해결하시면 어떠하실지...
물론, 다른 방법의 IPC를 사용하셔도 무방할 듯 하지만요...
네 갈길을 가라! 남이야 뭐라든!
아~ fork하면 ㅡㅡ;
책을 안본지 오래되서요.
3달간 리니지만해서 바보됐네요. ㅋㅋㅋ
전역변수 안되는군요.
요즘 윈도우책을 보느라 윈도우 쓰레드에서쓰는 크리티컬섹션하고 착각했네요.
이렇게 말하셔서... pipe나 그런건 말안하고 그냥 크리티컬 섹션이 생각나서 말했는데... 실수했네요 ㅡ.ㅜ
프로세스를 나누는거였는데 -_-;;;
네이드 파이프도 파이프니까 안되고...
파일을 이용하시던가요. ㅡㅡ;
처음에 check.txt.파일을 만들어서 내용을 0000000000으로 채웁니다.
자식이 쓰는게 완료되면 check.txt 파일의 내용을 11111111111로 바꿉니다.
부모가 check라는 파일을 읽어서 내용이 1111111111이면 바뀐것이겠죠.
실력이 허접해서... 그냥 생각나는데로 말했습니다.
어차피 fopen은 배웠을테니까요.
윈도우도 프로세스간에 공유가 안되서, 파일을 이용해서 공유하는게 있거든요.(용어조차 기억이 잘 ㅡㅡ;)
어쨌든 다른 프로세스니까 시스템 전역적인걸 이용하셔야 할듯하네요.
아마도
파이프 쓰세요
생산자/소비자 문제인가요?
파이프 -> 읽기/쓰기
두개의 디스크립터로
부모는 쓰기만하고
자식은 읽기만하고
숙제 소스가 필요하신가요?
500원만 주세요..하핫;;(농담인거 아시죠? :))
https://nicesj.com
https://blog.nicesj.com
별다른 조건이 없다면.... ipc가 필요할까요? 파일이라면 size
별다른 조건이 없다면.... ipc가 필요할까요?
파일이라면 size만으로도 가능하리라 생각되는데요.. :)
로그를 일정한 시간마다 읽어 주는걸 만든 적이 있는데..
그냥 화일 크기만 체크하는 방법으로 추가된만큼 읽었던 기억이 납니다.
댓글 달기