wait 함수 (부모가 자식을 안기다립니다.) 리눅스환경
글쓴이: gag2012 / 작성시간: 월, 2018/05/14 - 1:58오전
#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> int main() { int x, y, status, i; int cnt = 0; int flag = 0; char buf[50]; char str[50]; char * argv[10]; char * ptr; for (i = 0; i<10; i++) { putchar('$'); fgets(buf, 49, stdin); buf[strlen(buf) - 1] = 0; strcpy(str, buf); ptr = strtok(buf, " "); while (ptr != NULL) { argv[cnt] = ptr; cnt++; ptr = strtok(NULL, " "); } if (!strcmp(argv[cnt - 1], "&")) { argv[cnt - 1] = 0; flag = 1; } else { argv[cnt] = 0; } if (!strcmp(argv[0], "exit")) exit(0); x = fork(); if (x == 0) { printf("I am child to execute %s\n", str); y = execve(argv[0], argv, 0); if (y<0) { perror("exec failed"); exit(1); } } else { if (flag == 0) { wait(&status); } } flag = 0; cnt = 0; } return 0; }
리눅스 shell과 같이 &를 유무에 따라 execve()함수를
&가 없다면 일반적인 실행하고 $을 찍게 했고
&가 있으면 $을 먼저 찍고 일반적인 실행을 하도록 했습니다.
즉, &가 없으면 부모가 자식이 죽을때까지 기다리다가 죽으면 $을 찍고
&가 있으면 자식을 기다리지 않고 바로 $을 찍도록 말입니다.
하지만 결과는 다음과 같습니다.
======================결과값 $/bin/ls I am child to execute /bin/ls ch f1 f2 shell shell.c t t.c test test.c testfile $/bin/ls & $I am child to execute /bin/ls & ch f1 f2 ch f1 f2 shell shell.c t t.c test test.c testfile $/bin/ls $I am child to execute /bin/ls ch f1 f2 shell shell.c t t.c test test.c testfile =======================
첫 번째 경우와 두 번째 경우는 제가 원하는 결과입니다.
하지만 세 번째 경우에는 &를 붙이지 않았기 때문에 $가 일반적인 실행 뒤에 나와야하는데
&를 붙인 것마냥 일반적인 실행보다 $가 먼저 찍힙니다ㅠㅠ....
왜 그런걸까요?...
여기서 일반적인 실행은 execve를 의미합니다...
부탁드립니다(_ _)
File attachments:
첨부 | 파일 크기 |
---|---|
123.png | 80.3 KB |
Forums:
wait는 자식중 하나만 종료해도 리턴합니다. 종료된
wait는 자식중 하나만 종료해도 리턴합니다. 종료된 자식중 wait로 처리안된 자식이 있는 경우도 리턴합니다.
이 경우를 보면 첫번째 자식이 생성되고 wait로 자식의 종료를 기다렸습니다.
두번째 자식이 생성되었고, 기다리지 않고 진행합니다.
세번째 자식이 생성되고, wait로 기다립니다. 이때 두번째 자식이 이미 종료하였기 때문에 wait는 바로 리턴합니다.
waitpid 함수를 사용하면, 특정 자식 프로세스의 종료를 기다릴 수 있습니다. 그 외에 man wait를 참조하시고, zombie process에 대해서도 검색해 보시면 도움이 될겁니다.
감사합니다
덕분에 잘 해결했습니다!
댓글 달기