미루고 미루고 미뤄뒀던 유닉스 시스템 프로그래밍 팀 프로젝트를 할 때가 됐다..
# 유닉스 시스템 프로그래밍 팀프로젝트
지난번에 정했던 대로 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);
}
나머지는 내일 이어가야겠다..ㅠ
'매일 공부 일기' 카테고리의 다른 글
(2022-11-28) 코로나 격리 해제 D-1 일기 (0) | 2022.11.28 |
---|---|
(2022-11-27) 격리 해제 D-2 일기 (0) | 2022.11.28 |
(2022-11-25) 확진자의 소소한 일기 (0) | 2022.11.25 |
(2022-11-24) 확진자의 소소한 일기 (0) | 2022.11.24 |
(2022-11-23) 확진자의 소소한 일기 (0) | 2022.11.23 |