지식 IN 답변하는데... 신기한 소스가 있네요.

랜덤여신의 이미지

지식 IN 답변하는데... 신기한 소스가 있더군요.

다음 소스가 뭐 하는 소슨가요?

#include <stdio.h>

main(int argc, char *argv[])
{
	char ch, first, last;
	int pid;
	long i;
	if((pid=fork())>0)
	{ /*parent */
	first='A';
	last='Z';
	}
	else if(pid==0)
	{ /* child */
	first='a';
	last='z';
	}
	else
	{/*not fork(2) : Error Handling Routine */
	perror(argv[0]);
	exit(1);
	}
printf("\n");
for(ch=first; ch<=last; ch++)
{
	/*delay loop */
	for(i=0; i<=1000000; i++);
	write(1, &ch, 1);
}
}
cdpark의 이미지

프로세스를 fork한 후에 parent는 A부터 Z까지 찍고, child는 a부터 z까지 찍는 프로그램인데요? 뭐가 신기한거죠? -_-;;

gizrak의 이미지

Quote:
fred@linux:~> ./a.out

ABCDaEbFGHcdIeJfKLghMiNOjkPlQmRSnoTpUqrVWsXtuYZ
fred@linux:~> vwxyz

fred@linux:~> ./a.out

ABCDaEbcFGHdIJeKfgLhMNiOjkPQlRmnSoTUpVqrWXsYtuZ
fred@linux:~> vwxyz

fred@linux:~> ./a.out

ABCaDbcEFGdHeIJfgKhLMijNkOPlQmnRSoTpqUVrWsXtYZ
fred@linux:~> uvwxyz

좀 재미있는 프로그램은 맞네요... 그러니까 단순히 두개의 프로세스가 문자를 출력을 하는것 이상으로...

두 프로세스가 경쟁을 하듯이 출력을 합니다. 즉... 어떤 동기화되지 않은 출력을 보여줍니다.

위에서 보듯이 각 프로세스가 cpu를 얼마만큼 잡고 있느냐의 문제는 프로그램 실행때마다 다르게 나오죠.

그런 의미로 만든 프로그램 같으네요... 프로세스 스케쥴링과 같은 문제의 예제로 쓰는 예제 같습니다.

아... 그리고 또 재미있는 부분은 부모프로세스(대문자를 찍는...)가 종료하면 프로그램이 끝나면서 프롬프트로 돌아오지만 자식프로세스가 계속 돌아 나머지 문자들을 끝까지 출력해 줍니다.

위에서 프롬프트 이후에 소문자들이 출력되는 것 처럼요...

암튼 실행해 보면 재미있는 프로그램 맞습니다.

void main(void)
{
char *brain;
brain = malloc(sizeof(stress));

free(brain);
}
뭐든지 답은 간단한데서 시작한다.

mudori의 이미지

레이스 컨디션 만드는거네요

illuza의 이미지

궁금한 것은 char first, last 값은 부모 프로세스와 자식 프로세스가 서로 하나씩 가지고 있는 건가요? 공유하는 것이 아니라. 왠지 나중에 값을 집어 넣은 걸로 세팅이 될 거 같은데 실제로는 아니네요.

moonzoo의 이미지

같은 변수를 공유하는 것이 아니라.

일종의 복사본을 가지는 것이므로

최초에 fork할때만 같은 값을 가지고

이후에는 별도의 변수로서 취급됩니다.

seoleda의 이미지

illuza wrote:
궁금한 것은 char first, last 값은 부모 프로세스와 자식 프로세스가 서로 하나씩 가지고 있는 건가요? 공유하는 것이 아니라. 왠지 나중에 값을 집어 넣은 걸로 세팅이 될 거 같은데 실제로는 아니네요.

fork 했을경우 프로세스 전체가 복사 되므로,

부모와 자식은 서로 다른 영역에 first, last를 저장합니다.

실제적으로는 fork 했을때 바로 복사가 일어나느게 아니라 메모리의 내용이 변경될 시점에 복사가 일어 난다고 하지만...

하튼, 저 프로그램을 백그라운드로 실행시키고, ps 해보세요 2개의 프로세스가 있는것이 보입니다.

김충길의 이미지

fork() 는 두번 리턴된다고 볼 수 있습니다.

fork() 내부에서 process 이미지가 복사되고 리턴되는 부분에서 각기 리턴값이
다른게 리턴되죠.

처음 unix 시간에 fork()에 대해서 배웠을때의 그 신기함이란.

screen + vim + ctags 좋아요~

pynoos의 이미지

Unix의 모든 프로세스는

fork & exec 시스템 콜의 연속이라고 보시면 됩니다.

gizrak의 이미지

보통은 위에서처럼 부모 프로세스가 먼저 종료하도록 프로그램하진 않습니다.

위의 경우는 실행시키고 대문자 Z가 출력되면 프롬프트가 뜨는데 여기서 엔터를 입력하면 나머지 소문자들이 출력됩니다.

쉽게 말해 자식을 호출한 부모 프로세스가 먼저 종료한 것입니다. 물론 위의 프로그램 같은 곳에서 문제는 생기지 않지만.

보통 wait()같은 문장을 이용해 자식 프로세스가 죽기를 기다리게 만듭니다. 또한 임의의 시그널에 대한 대처로 setjmp와 longjmp같은 것으로 대처해 놓기도 하죠.

void main(void)
{
char *brain;
brain = malloc(sizeof(stress));

free(brain);
}
뭐든지 답은 간단한데서 시작한다.

litnsio2의 이미지

seoleda wrote:
illuza wrote:
궁금한 것은 char first, last 값은 부모 프로세스와 자식 프로세스가 서로 하나씩 가지고 있는 건가요? 공유하는 것이 아니라. 왠지 나중에 값을 집어 넣은 걸로 세팅이 될 거 같은데 실제로는 아니네요.

fork 했을경우 프로세스 전체가 복사 되므로,

부모와 자식은 서로 다른 영역에 first, last를 저장합니다.

실제적으로는 fork 했을때 바로 복사가 일어나느게 아니라 메모리의 내용이 변경될 시점에 복사가 일어 난다고 하지만...

하튼, 저 프로그램을 백그라운드로 실행시키고, ps 해보세요 2개의 프로세스가 있는것이 보입니다.

실제로 사용될때 복사가 일어나는건.. (copy on write) fork 가 아니고
vfork 아닌가용..? 그렇게 배운것 같아서...

pynoos의 이미지

fork가 맞습니다..

vfork는 부모와 자식이 메모리를 공유합니다. 실제 fork는 아니지요.
vfork는 바로 exec가 나오기를 기대하며 만들어진 몇몇 OS의 꽁수라고 할 수 있지요.
만일 기대처럼 exec가 나오지 않고 무슨 변수만 바꾸고 종료한다면, 부모의 변수에 영향을 미칩니다. 다만 예상할 수 없는 일도 있을 수 있으므로 그런 사용은 권하지 않지요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.