보기 힘들면 링크로 --> https://github.com/chankim9321/mywork/blob/master/syslec/procLec/signalLec/sigchild.c
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
int pidList[5]; // 자식 ps list
int pidEnd[5]; // 프로세스가 끝났는지 확인하는 배열
int cnt = 0;
int pid;
int k = 0;
void sigChildHandler(int signo){
int status, pid;
if((pid = waitpid(pidList[k], &status, 0)) > 0){
printf("child terminated : %d\n", pid);
cnt++;
pidEnd[k++] = 1;
}
}
void sigAlrmHandler(int signo){
return;
}
void setSignalHandler(){
signal(SIGCHLD, sigChildHandler);
signal(SIGALRM, sigAlrmHandler);
}
int main(int argc, char* argv[]){
setSignalHandler(); // 시그널 핸들러 설정
// 자식 프로세스 생성
for(int i=0; i<5; i++){
pidEnd[i] = 0;
pid = fork();
if(pid == 0) break;
else pidList[i] = pid; // 부모프로세스는 자식들의 프로세스 번호를 저장
}
if(pid == 0){ // 자식 프로세스 실행 명령어 구역
/*
...
...
*/
pause();
}
else{
int idx = 0;
// 자식 프로세스의 수행시간이 전부 랜덤이고, 순차적으로 끝내야 한다면
// 부모 프로세스는 자식프로세스 수행이 끝났을 때, 즉 pause() 실행될 때 까지
// 알람 시그널을 계속 호출한다.
// if문을 통해 프로세스 종료의 여부를 확인후 idx값을 증가시켜 순차적으로 확인, 종료한다.
while(cnt < 5){
kill(pidList[idx], SIGALRM);
if(pidEnd[idx]) idx++;
}
printf("부모 종료\n");
}
return 0;
}
자식 프로세스를 5개 생성 후 종료할 때는 생성 순서대로 순차적으로 종료되는 프로그램임.
일자식 프로세스의 수행시간은 랜덤이라 생각하고 만든 코드인데 main 함수 while문 안에서 프로세스가 끝날 때 까지 kill()을 호출하다보니
과연 이게 효율적인가 싶음. 근데 이것보다 좋은 코드도 잘 안떠올려짐...
해당 댓글은 삭제되었습니다.
자식 프로세스가 작업을 종료하고 순차적으로 종료시키기위해 대기하고 있고 부모프로세스는 자식이 다 종료될때까지 기다리고있는 상황임 이제 생성순서대로 알람시그널 호출시켜서 waitpid로 자식 프로세스 종료를 부모가 확인하고있는 코드야 그냥 시그널 기초예제라 생각해줘 - dc App
음 그니까 thread 3의 작업이 끝났더라도 thread 1, 2가 먼저 종료될 때 까지 기다리고 있어야 한다는 조건을 임의로 추가한 거지?
ㅇㅇ 생성된 프로세스의 작업 수행시간을 랜덤으로 가정하고 짠거야 - dc App
세마포어를쓰고 while지우면안됨?
아직 세마포어에 대한 지식이 부족해서 잘 모르겠는데.. 보통 스레드 동기화 할때 쓰는 개념아닌가?
https://pastebin.com/4Wq5Ch7F
이렇게 써라
참고로 chatgpt로 뽑음
세마포어는 아직 안써봐서 공부좀 해야할듯..ㄳㄳ