wait 함수 (부모가 자식을 안기다립니다.) 리눅스환경

gag2012의 이미지

#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: 
첨부파일 크기
Image icon 123.png80.3 KB
karkayan의 이미지

wait는 자식중 하나만 종료해도 리턴합니다. 종료된 자식중 wait로 처리안된 자식이 있는 경우도 리턴합니다.

이 경우를 보면 첫번째 자식이 생성되고 wait로 자식의 종료를 기다렸습니다.
두번째 자식이 생성되었고, 기다리지 않고 진행합니다.
세번째 자식이 생성되고, wait로 기다립니다. 이때 두번째 자식이 이미 종료하였기 때문에 wait는 바로 리턴합니다.

waitpid 함수를 사용하면, 특정 자식 프로세스의 종료를 기다릴 수 있습니다. 그 외에 man wait를 참조하시고, zombie process에 대해서도 검색해 보시면 도움이 될겁니다.

gag2012의 이미지

덕분에 잘 해결했습니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.