프로그래밍

 3198, 1/160 회원가입  로그인  
   rmb2013
   콘솔출력과 리다이렉션 을 통한 출력결과가 다른이유는 무엇일까요?

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