리눅스 분류
리눅스 코드 해석 도와주세요..
작성자 정보
- 여덟하늘 작성
- 작성일
컨텐츠 정보
- 3,307 조회
- 1 댓글
- 0 추천
- 목록
본문
#include <signal.h>
command(cmd) /* run a shell command from C program */ // command 함수의 시작
char *cmd;
{
int chpid, fork(); // 함수와 변수들을 선언해 주는 부분입니다.
int w, status, wait();
void (*istat) (), (*qstat) ();
if ((chpid = fork() ) == 0) // 이 곳에서 자식 프로세스를 생성합니다.
{
execlp("sh","sh", "-c", cmd, (char *) 0); // 자식 프로세스를 새로운 프로세스로 교체
exit(127);
}
istat = signal(SIGINT, SIG_IGN); // SIGINT 와 SIGQUIT 시그널을 무시하도록 설정
qstat = signal (SIGQUIT,SIG_IGN);
while ((w = wait(&status)) != chpid && w != -1) // 자식 프로세스가 종료되기를 기다립니다.
wait는 fork에 의해 생성된 프로세스 뿐만 아니라 그에서 파생된 모든
프로세스의 종료시에도 리턴합니다. 그러니 내가 기다리는 프로세스
(즉 PID가 chpid인 프로세스)가 아닌 프로세스가 종료하여 wait가
리턴했더라도 chpid가 리턴될때까지 계속 더 기다리라는 목적으로
while문을 사용하는 것이 당연합니다. 그런데 wait는 child 프로세스의
종료 뿐만 아니라 시그널이 발생하여도 리턴하는데 이때는 -1이
리턴합니다. 시그널 발생시에는 child의 종료를 무턱대고 대기할 수
없으므로 이를 특수상황으로 고려하여 while문을 이탈하게 한 것입니다.
참고로 프로세스는 _exit 호출에 이르러야 종료로 간주됩니다.
; /* null */
signal(SIGINT, istat); SIGINT 시그널 실행
signal(SIGQUIT, qstat); SIGQUIT 시그널 무시
return((w != -1) ? (status >> 8) : -1);
}
main()
{
printf("%d\n", command("date > Date; cat Date"));
printf("%d\n", command("date -u"));
printf("%d\n", command("sleep 10; echo done"));
}
여기서 return((w != -1) ? (status >> 8) : -1); 과 main안에 있는것이 무슨 의미인지랑 왜 필요한지 모르겠습니다.
첫번째는 한국시간(kst), 두번째는 세계협정시간(utc), 세번째는 10초 느리고 done 호출
설명이 조금 필요합니다.. ㅠ
나머지 주석도 맞는지 확인해 주시면 감사합니다.
그리고 마지막으로 이게 실행하면 2021.11.27 토 kst 한국 시간인것은 알겠습니다만
그 아레 0 은 왜 나오는지 모르겠습니다..
관련자료
-
이전
-
다음
댓글 1
정원용님의 댓글
- 정원용
- 작성일
command()함수가 return값을 반환하고 main함수의 printf에서 %d로 command의 리턴값을 출력하고 있어서 0이 나오고 있네요.
그리고 command내에서 커맨드의 stdout은 그냥 출력하고 있는지라 명령어 결과가 그대로 나오는 거고요.
그리고 command내에서 커맨드의 stdout은 그냥 출력하고 있는지라 명령어 결과가 그대로 나오는 거고요.