|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3175 [복사]
운영체제 수업시간 과제를 하다가 신기한 현상을 보았네요.
부모는 자식프로세스 10개를 만들고,
자식 프로세스는
=>자신이 몇번째로 생성되었는지,
=>그때그때의시간을 표시하는 문장을 1ms 단위 간격으로 100문장을 동일한 파일에 출력
시키는 프로그램을 작성하는 것입니다.
제가 작성한 소스 코드는 아래 와 같구요.
test3.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
#define C_NUM 10 //fork 실행 횟수 - for문에서 사용.
#define P_NUM 100 //각 child 가 출력할 문장 개수.
int main(void)
{
int i,j,num=1;
char f_name[]="result.txt";
FILE *f;
pid_t new_pid;
pid_t root_pid;
pid_t pid_stack[C_NUM];
time_t second;
struct tm *date;
if((f=fopen(f_name,"a+"))==NULL) //fork이전에 file 을 열어놓고.
{ printf("fopen Err!\n\n");
exit(-1);
}
root_pid = getpid();
printf("\nStart to call fork()\n");
for(i=0; i < C_NUM ; i++)
{
if((new_pid = fork()) < 0) //fork 를 수행하고.
{
printf("\n\nfork Err!\n\n");
exit(-1);
}
if(new_pid == 0) //Child 는 시간 출력후 종료한다.
{
for(j=0;j < P_NUM; j++) // num 번째 프로세스는 P_NUM 개
{ // 문장을 출력 한다.
time(&second);
date = localtime(&second);
fprintf(f,"[Process %d #%d] %2d:%2d:%2d\n",i,j,date->tm_hour,date->tm_min,date->tm_sec);
usleep(1000);
}
fclose(f);
return 1; // Child 에서 종료시 1 리턴.
}
else
{
pid_stack[i] = new_pid;
printf("\nNo.%d fork() is done\n",i);
//usleep(1000);
}
}
for(i=0;i<C_NUM;i++)
{
wait(pid_stack[i]);
}
printf("\nParent process has finished.\n\n");
fclose(f);
return 0;
}
fprintf 대신에 그냥 콘솔에다가 printf 를 사용해서 출력시키면, 제가 의도하는 대로
여러 자식 프로세스 들이 CPU를 번갈아가며 사용해서 뒤죽박죽 순서가 섞여 출력이 되는데요.
동일한 프로그램을 |more 을 통해 본다던지, 아니면 처음코드 데로 fprintf 를 사용해서
파일로 출력을하면, 생성된 자식 프로세스 별로 정렬되어서 보이는. 신기한 효과가 나오더군요...
같은 프로그램인데, 콘솔에 바로 뿌릴때랑 다르게 보이는 것일까요?
|
Hit : 4748 Date : 2011/10/07 02:56
|