지난 프로그래밍 수업에서 해결되지 몇가지 의문점이 날 미치도록 만들었는데,
아직도 모른다. -_-;
첫째가 exit()의 존재 유무... 프로그램이 저녀석이 있던 없던 종료하더란 말이다.
대충 아래와 같은 코드이다.
저렇게 exit()가 없는데 return도 없는데 요녀석은 문제없이 알아서 종료한다.
원래 아무 처리 없이도 에러가 뜨지 않긴 하지만 문득 exit() 의 필요성에 의문이.. -_-
두번째, pause() 의 사용이다.
부모와 자식 프로세스가 서로 signal의 발생과 pause를 반복하며 5번 출력후, 종료하는 프로그램이다.
아래와 같이 구현했었는데, (그때의 기억을 더듬어 다시 적어보았다.)
그런데 이것을 실제로 실행해보면, 이렇게 뜬다.
(중간중간 출력코드를 삽입하였다. 아마도 이렇게 뜰꺼다 -_- 기억이 가물가물~)
음... Child 가 pause()로 대기 후 Parent의 signal로 깨어나지 않는다.
"signal = SIGCHLD" 에서 보듯이 child가 먼저 죽어 버린다.
그리고 Parent는 계속 다음 signal을 기다리며 영원히 종료되지 않는다.
Child가 pause()로 정지된 후 signal을 받고 돌아 왔을때,
다음 문장이 아닌 바로 종료된다는것에 이해되지 않는다.
간단한 다른 프로그램을 만들어 돌렸을 경우, pause()에서 돌아왔을때는 다음문장으로 가게된다.
하지만, 위와같이 종료되는 이유. 모르겠다
인터넷엔 모두 함수나 사용법에 대한 설명뿐 -_-
인터넷이 아무리 넓은들 무얼하리~ 찾고 싶은걸 못 찾는걸 ㅠㅠ
=====================================================================================================
몇가지 추가하여,
fork()의 예제 중 조인씨 위키에서 아래와 같은것을 찾았다.
그냥 딱 봐도 안 끝날것 같은 예제,
그래도 혹시나하고 돌려보니 안 끝난다. 푸하하ㅋㅋㅋ
예제가 머 이래 -_-
아직도 모른다. -_-;
첫째가 exit()의 존재 유무... 프로그램이 저녀석이 있던 없던 종료하더란 말이다.
대충 아래와 같은 코드이다.
...
int main(..){
...
...
alarm(sec);
pause();
}
void interrupt(int signo){
printf("user interrupt\n");
}
void alarm_(int signo){
printf("time out\n");
}
수업땐 수업용으로 exit()를 대충 끼워 맞춰 작성했다만, int main(..){
...
...
alarm(sec);
pause();
}
void interrupt(int signo){
printf("user interrupt\n");
}
void alarm_(int signo){
printf("time out\n");
}
저렇게 exit()가 없는데 return도 없는데 요녀석은 문제없이 알아서 종료한다.
원래 아무 처리 없이도 에러가 뜨지 않긴 하지만 문득 exit() 의 필요성에 의문이.. -_-
두번째, pause() 의 사용이다.
부모와 자식 프로세스가 서로 signal의 발생과 pause를 반복하며 5번 출력후, 종료하는 프로그램이다.
아래와 같이 구현했었는데, (그때의 기억을 더듬어 다시 적어보았다.)
...
int main(...){
int i=5;
...
if((pid = fork()) == 0){
ppid=getppid();
while(i--){
pause();
kill(ppid, SIGUSR1);
}
exit(0);
}else{
while(i--){
kill(pid, SIGALRM);
pause();
}
exit(0);
}
}
void sig(int signo){
printf("signal = SIGUSR1\n");
}
void child(int signo){
printf("signal = SIGCHLD\n");
}
int main(...){
int i=5;
...
if((pid = fork()) == 0){
ppid=getppid();
while(i--){
pause();
kill(ppid, SIGUSR1);
}
exit(0);
}else{
while(i--){
kill(pid, SIGALRM);
pause();
}
exit(0);
}
}
void sig(int signo){
printf("signal = SIGUSR1\n");
}
void child(int signo){
printf("signal = SIGCHLD\n");
}
그런데 이것을 실제로 실행해보면, 이렇게 뜬다.
(중간중간 출력코드를 삽입하였다. 아마도 이렇게 뜰꺼다 -_- 기억이 가물가물~)
[sfect @ ~ ]$ ./test
Child : fork()
Child : pause()
Parent : send signal_alarm to child
Parent : pause()
signal = SIGCHLD
Parent : return loop
Parent : send signal_alarm to child
Parent : pause()
Child : fork()
Child : pause()
Parent : send signal_alarm to child
Parent : pause()
signal = SIGCHLD
Parent : return loop
Parent : send signal_alarm to child
Parent : pause()
음... Child 가 pause()로 대기 후 Parent의 signal로 깨어나지 않는다.
"signal = SIGCHLD" 에서 보듯이 child가 먼저 죽어 버린다.
그리고 Parent는 계속 다음 signal을 기다리며 영원히 종료되지 않는다.
Child가 pause()로 정지된 후 signal을 받고 돌아 왔을때,
다음 문장이 아닌 바로 종료된다는것에 이해되지 않는다.
간단한 다른 프로그램을 만들어 돌렸을 경우, pause()에서 돌아왔을때는 다음문장으로 가게된다.
하지만, 위와같이 종료되는 이유. 모르겠다
인터넷엔 모두 함수나 사용법에 대한 설명뿐 -_-
인터넷이 아무리 넓은들 무얼하리~ 찾고 싶은걸 못 찾는걸 ㅠㅠ
=====================================================================================================
몇가지 추가하여,
fork()의 예제 중 조인씨 위키에서 아래와 같은것을 찾았다.
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int pid;
pid = fork();
if (pid > 0)
{
printf("부모 프로세스 %d : %d\n", getpid(), pid);
pause();
}
else if (pid == 0)
{
printf("자식 프로세스 %d\n", getpid());
pause();
}
else if (pid == -1)
{
perror("fork error : ");
exit(0);
}
} |
그래도 혹시나하고 돌려보니 안 끝난다. 푸하하ㅋㅋㅋ
예제가 머 이래 -_-



