매일 공부 일기

(2022-11-26) 확진자의 고단한 코딩 일기

HJ39 2022. 11. 27. 00:24

미루고 미루고 미뤄뒀던 유닉스 시스템 프로그래밍 팀 프로젝트를 할 때가 됐다..

 

# 유닉스 시스템 프로그래밍 팀프로젝트

지난번에 정했던 대로 pipe를 이용하여 프로세스끼리 점수를 내는 프로그램을 짜야한다.

우선 계획으로는 fork()를 2개 시킨 후 child process에서 스레드를 이용해서 parent process에 점수를 서로서로 경쟁해서 올리는 건데 음.. fork해서 실행하는 것도 어렵다.. 헣

 

우선 pipe를 이용해서 쓰레드 없이 작동까지는 성공했지만.. 스레드를 이용하니까 부모 프로세스에서 읽지를 않는다 (왜 이러지)

#include <sys/time.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

#define MSGSIZE   6
char *msg1 = "my";
char *msg2 = "done";
void parent(int p[2][2]);
int child(int p[]);
void *sendingMsg(int p[]);

int main(void){
 int pip[2][2];
 int i;
 /* 세 개의 통신 파이프를 생성하고, 세 개의 자식을 낳는다. */
 for (i = 0; i < 2; i++){
        if (pipe(pip[i]) == -1)
                exit(2);
        switch (fork()){                        
                case -1:                        /* 오류 */
                        exit(3);                
                case 0:                         /* 자식 */
                        child (pip[i]);
        }
 }
 parent (pip);
 exit (0);
}

//void* checkingMsg(int p[][]){

//}

/* 부모는 세 개의 파이프에 전부 귀를 기울이고 있다. */
void parent(int p[2][2]){               /* 부모의 코드 */
        char buf[MSGSIZE], ch;
        fd_set set, master;
        int i;
        int point = 0 ;
//      p_thread pthread;
//      int pthread;

         /* select 시스템 호출의 비트 마스크를 설정한다. */
        FD_ZERO (&master);
        FD_SET (0, &master);
        for (i = 0; i <2; i++)
                FD_SET (p[i][0], &master);


        //pthread = pthread_create(&pthread,NULL,checkingMsg, p[][]);

        /* 타임아웃 없이 select를 호출한다. 사건이 발생할 때까지 select는 봉쇄될
 것이다 */
        while (set = master, select (p[2][0], &set, NULL, NULL, NULL) > 0) {
        for (i = 0; i < 2; i++) {
                printf("checking..\n");
                if (FD_ISSET(p[i][0], & set))   {
                        if (read(p[i][0], buf, MSGSIZE)>0){
                                printf("Message from child%d\n", i);
                                printf("MSG=%s\n",buf);	
								if(i == 0)
                                        point += 2;
                                else
                                        point -= 1;
                                printf("total point = %d\n",point);
                        }
                }
        }

        if(point == 3){
                exit(0);
        }

  /* 서버는 모든 자식이 죽으면 주 프로그램으로 복귀한다. */
        if (waitpid (-1, NULL,WNOHANG) == -1)
                return;

        }
}
void* sendingMsg(int p[]){
        for(int i=0;i<10;i++){
        printf("ready send, msg = %s\n",msg1);
        write(p[1],msg1,MSGSIZE);
        sleep(1);
        printf("finish sleep\n");
        }
        pthread_exit(NULL);
}

int child(int p[]) {
        int count;
        pthread_t p_thread,p_timer;
        int thread,timerCheck;
        void* t;

//      timerCheck = pthread_create(&p_timer,NULL,

        printf("child process start \n");
        thread = pthread_create(&p_thread,NULL,sendingMsg,p);
        if(thread)
                printf("Thread ERROR!\n");


        printf("finished child process\n");
        pthread_exit(NULL);
}

나머지는 내일 이어가야겠다..ㅠ