#include <unistd.h>
#include <signal.h>
#include <sys/times.h>
#include <stdio.h>
#include <time.h>
long int i1=0,i2=0,i3=0,gaptime=0;
long int time1=0,time2=0,time3=0;
long int tick;
int num = 0;
int num1 = 0;
static void sig_int(int signo)
{
printf("child caughtn");
num1++;
printf("num1 = %dn",num1);
}
int main(void)
{
int statlot;
pid_t pid,pid1;
struct tms buf;
tick = sysconf(_SC_CLK_TCK);//nano second can be acquired
printf("time = %ldn",times(&buf)/tick);
struct sigaction sig;
sig.sa_handler = sig_int;
sigemptyset(&sig.sa_mask);
sig.sa_flags = 0;
sigaction(SIGINT,&sig,NULL);
pid1 = getpid();
i1 = times(&buf)/tick;
if((pid = vfork()) < 0)//for sharing variable between parent and child
printf("fork error 1n");
if((pid1 = fork()) < 0)
printf("fork errorn");
else if(pid1 == 0)
{
sleep(5);
printf("before killn");
kill(pid,SIGINT);
printf("after killn");
_exit(0);
}
else
_exit(0);//여기까지 읽으면 되
printf("after pid1 processn");
if(pid == 0)//pid is return value, not child pid
{
num++;
printf("num = %dn",num);
pause();
time1 = times(&buf)/tick;
gaptime += (time1 - i1);
printf("gaptime = %ldn",gaptime);
_exit(0);
}
sleep(5);
i2 = times(&buf)/tick;
if((pid = vfork()) < 0)
printf("fork error2n");
if((pid1 = fork()) < 0)
printf("fork errorn");
else if(pid1 == 0)
{
sleep(7);
kill(pid,SIGINT);
}
else
_exit(0);
if(pid == 0)
{
num++;
printf("num = %dn",num);
pause();
time2 = times(&buf)/tick;
gaptime += (time2 - i2);
printf("gaptime = %ldn",gaptime);
_exit(0);
}
sleep(7);
if((pid1 = fork()) < 0)
printf("fork errorn");
else if(pid1 == 0)
{
sleep(5);
kill(pid,SIGINT);
_exit(0);
}
else
_exit(0);
i3 = times(&buf)/tick;
if((pid = vfork()) < 0)
printf("fork error 3n");
if((pid1 = fork()) < 0)
printf("fork errorn");
else if(pid1 == 0)
{
sleep(9);
kill(pid,SIGINT);
_exit(0);
}
if(pid == 0)
{
num++;
printf("%ldn", time3);
pause();
time3 = times(&buf)/tick;
gaptime += (time3 - i3);
_exit(0);//for not flushing stream
}
sleep(9);
if(num == 3)
{
printf("child processes's running sum time = %ld secondsn", gaptime);
}
return 0;
}
//여기까지 읽으면 됨 여기까지 읽으면 되 나머지는 반복 되는 부분이니까.
자식 프로세스를 여러 개 생성하고 신호로 죽인뒤, 마지막에 실행시간의 합 출력하는 프로그램인데...
간단하게 소스 설명을 하자면, vfork로 자식 프로세스 생성(자식 프로세스 공간에서 선언된 변수가 자식 프로세스 종료시 없어지면 실행시간을 구할 길이 없으니까 부모와 변수가 공유되는 vfork함수를 이용한거야.)하고 자식 프로세스는 pause한 뒤(앞 뒤로 times함수 호출해서 저장 해둬 나중에 실행 시간 구하려고...) 자식 프로세스 이전에 또 fork로 프로세스를 생성해서 이 프로세스는 몇초간 sleep한 뒤, vfork로 생성한 자식 프로세스를 sigint신호를 보내. 그럼 vfork로 생성한 프로세스가 pause에서 깨어나겠지 그럼 나머지 작업 수행하고 종료되. //신호까지 배운 지식으로 충분히 완벽하게 만들 수 있는 프로그램이라니까 이상한 딴지는 걸지마 뭐 ipc를 이용하라느니 이런거 그건 맨 끝이나 되야 나올 내용이니까...
근데 문제는 fork로 생성한 프로세스(vfork로 생성한 프로세스한테 sigint신호 주는 프로세스)가 코드순서대로 실행이 안되고 printf문 -> kill함수 -> printf문 순서인데 이상하게 kill함수가 2번 호출되는지 신호 처리부가 거기에서만 2번 호출되고 fork프로세스 if문에서도 순서가 뒤죽박죽이야. kill함수가 제일 먼저실행되기도 하고 아예 kill함수가 호출안되고 앞뒤 printf문만 실행되기도해... 문제가 뭔지 알려줘.ㅜㅜ
길어서 읽기 실타