지식 IN 답변하는데... 신기한 소스가 있네요.
글쓴이: 랜덤여신 / 작성시간: 화, 2004/03/23 - 5:58오후
지식 IN 답변하는데... 신기한 소스가 있더군요.
다음 소스가 뭐 하는 소슨가요?
#include <stdio.h> main(int argc, char *argv[]) { char ch, first, last; int pid; long i; if((pid=fork())>0) { /*parent */ first='A'; last='Z'; } else if(pid==0) { /* child */ first='a'; last='z'; } else {/*not fork(2) : Error Handling Routine */ perror(argv[0]); exit(1); } printf("\n"); for(ch=first; ch<=last; ch++) { /*delay loop */ for(i=0; i<=1000000; i++); write(1, &ch, 1); } }
Forums:
프로세스를 fork한 후에 parent는 A부터 Z까지 찍고, child
프로세스를 fork한 후에 parent는 A부터 Z까지 찍고, child는 a부터 z까지 찍는 프로그램인데요? 뭐가 신기한거죠? -_-;;
[quote]fred@linux:~> ./a.outABC
좀 재미있는 프로그램은 맞네요... 그러니까 단순히 두개의 프로세스가 문자를 출력을 하는것 이상으로...
두 프로세스가 경쟁을 하듯이 출력을 합니다. 즉... 어떤 동기화되지 않은 출력을 보여줍니다.
위에서 보듯이 각 프로세스가 cpu를 얼마만큼 잡고 있느냐의 문제는 프로그램 실행때마다 다르게 나오죠.
그런 의미로 만든 프로그램 같으네요... 프로세스 스케쥴링과 같은 문제의 예제로 쓰는 예제 같습니다.
아... 그리고 또 재미있는 부분은 부모프로세스(대문자를 찍는...)가 종료하면 프로그램이 끝나면서 프롬프트로 돌아오지만 자식프로세스가 계속 돌아 나머지 문자들을 끝까지 출력해 줍니다.
위에서 프롬프트 이후에 소문자들이 출력되는 것 처럼요...
암튼 실행해 보면 재미있는 프로그램 맞습니다.
void main(void)
{
char *brain;
brain = malloc(sizeof(stress));
free(brain);
}
뭐든지 답은 간단한데서 시작한다.
레이스 컨디션 만드는거네요
레이스 컨디션 만드는거네요
궁금한 것은 char first, last 값은 부모 프로세스와 자식 프
궁금한 것은 char first, last 값은 부모 프로세스와 자식 프로세스가 서로 하나씩 가지고 있는 건가요? 공유하는 것이 아니라. 왠지 나중에 값을 집어 넣은 걸로 세팅이 될 거 같은데 실제로는 아니네요.
..
같은 변수를 공유하는 것이 아니라.
일종의 복사본을 가지는 것이므로
최초에 fork할때만 같은 값을 가지고
이후에는 별도의 변수로서 취급됩니다.
[quote="illuza"]궁금한 것은 char first, last
fork 했을경우 프로세스 전체가 복사 되므로,
부모와 자식은 서로 다른 영역에 first, last를 저장합니다.
실제적으로는 fork 했을때 바로 복사가 일어나느게 아니라 메모리의 내용이 변경될 시점에 복사가 일어 난다고 하지만...
하튼, 저 프로그램을 백그라운드로 실행시키고, ps 해보세요 2개의 프로세스가 있는것이 보입니다.
fork() 는 두번 리턴된다고 볼 수 있습니다.fork() 내부
fork() 는 두번 리턴된다고 볼 수 있습니다.
fork() 내부에서 process 이미지가 복사되고 리턴되는 부분에서 각기 리턴값이
다른게 리턴되죠.
처음 unix 시간에 fork()에 대해서 배웠을때의 그 신기함이란.
screen + vim + ctags 좋아요~
Unix의 모든 프로세스는 fork & exec 시스템 콜
Unix의 모든 프로세스는
fork & exec 시스템 콜의 연속이라고 보시면 됩니다.
---
http://coolengineer.com
보통은...
보통은 위에서처럼 부모 프로세스가 먼저 종료하도록 프로그램하진 않습니다.
위의 경우는 실행시키고 대문자 Z가 출력되면 프롬프트가 뜨는데 여기서 엔터를 입력하면 나머지 소문자들이 출력됩니다.
쉽게 말해 자식을 호출한 부모 프로세스가 먼저 종료한 것입니다. 물론 위의 프로그램 같은 곳에서 문제는 생기지 않지만.
보통 wait()같은 문장을 이용해 자식 프로세스가 죽기를 기다리게 만듭니다. 또한 임의의 시그널에 대한 대처로 setjmp와 longjmp같은 것으로 대처해 놓기도 하죠.
void main(void)
{
char *brain;
brain = malloc(sizeof(stress));
free(brain);
}
뭐든지 답은 간단한데서 시작한다.
[quote="seoleda"][quote="illuza"]궁금한 것은
실제로 사용될때 복사가 일어나는건.. (copy on write) fork 가 아니고
vfork 아닌가용..? 그렇게 배운것 같아서...
fork가 맞습니다..vfork는 부모와 자식이 메모리를 공유합니
fork가 맞습니다..
vfork는 부모와 자식이 메모리를 공유합니다. 실제 fork는 아니지요.
vfork는 바로 exec가 나오기를 기대하며 만들어진 몇몇 OS의 꽁수라고 할 수 있지요.
만일 기대처럼 exec가 나오지 않고 무슨 변수만 바꾸고 종료한다면, 부모의 변수에 영향을 미칩니다. 다만 예상할 수 없는 일도 있을 수 있으므로 그런 사용은 권하지 않지요.
---
http://coolengineer.com
댓글 달기