fork 에 대한 질문입니다.

익명 사용자의 이미지

fork()를 사용해서 프로세스를 세개 생성하고 싶습니다.
그리고 각각의 프로세스에서 ex1.c ex2.c ex3.c 라는 파일을 실행시키고
싶습니다.
현재 제가 아는 초보의 수준으로는 fork 로 새로운 프로세스를 생성시킨
후 프로세스에서 하는 일을 그 파일내에서 정의해서 실행시키는 정도밖에
모르겠습니다.
다른 파일을 실행시키는 것이 가능한지 알고 싶습니다.

그리고 또 하나 질문, fork()로 발생한 PID를 사용해서 그 프로세스가 죽
어있는지 살아있는 지 확인하고 싶습니다.
ex1.c ex2.c ex3.c 파일은 기본적으로 무한루프를 돌고 있으면 만약 프로
세스가 죽으면 다시 실행을 시켜야 하거든요.
프로세스의 존재 유무를 간단히 확인할 수 있는 함수 가 혹시 존재하는 지
요..

아시는 분 계시면
부족한 제게 답변 주시면 정말 감사하겠습니다.

즐거운 하루 되시길..

익명 사용자의 이미지


간단히 답글 드립니다.

유닉스에서는 (거의) 모든 프로세스는 init 이란 놈이 직간접적으로
fork해서 만들어진 녀석입니다. 님께서 실행시키는 모든 명령어도요.

main 프로그램이 있으면 실행시 이 녀석이 fork()를 세번 해서
각각 ex1.c, ex2.c, ex3.c (아마 이 녀석들을 컴파일해서 생성된
실행파일이겠죠?) 를 exec류의 함수/시스템콜을 이용해서 실행시키시면 됩
니다.

이 녀석들이 죽었는지 보는 방법은,
별도로 main과 각 프로세스간 통신 채널을 두시는 방법도 있겠지만,
간단한 경우에는 SIGCHLD 시그널을 이용하는 방법이 있습니다.
child 프로세스가 죽은 경우에는 SIGCHLD가 parent 프로세스에 전달됩니
다. parent (이 경우는 main) 에서는 SIGCHLD에 대한 handler를 설정해 두
어서, SIGCHLD가 발생한 경우 wait 류의 함수/시스템콜을 수행시키시면 어
떤 child가 죽었는지를 알 수 있습니다. fork() 함수를 부를 때 child의
pid를 얻을 수 있으므로 이를 저장해 두었다가 wait 에서 얻어본 pid와 대
조를 하면 어떤 역할의 child(ex1, ex2, ex3)가 죽었는지를 알 수 있으니,
다시 fork/exec 를 이용해서 해당 프로그램을 띄우고 child 프로세스 정보
를 갱신해 두면 되겠죠.

개략적으로 말씀드렸는데, 여기에 여러 이슈들이 따라 붙으니까요,
Stevens 책 등으로 관련된 사항을 챙기시면 될 듯 합니다.

익명 사용자의 이미지

wait()류의 함수들은 자식이 종료할때까지 블럭됬다가 임의의(혹은 특정)
자식이 종료되면, 블로킹상태가 해제되는거 아닌가요??
SIGCHLD의 핸들러로 wait()군 함수들을 어떤 방식으로 사용한다는 것인가
요??
제가 모르고 놓치고 있는 부분이 있는 듯한데, 자세히 설명해주셨으면 합
니다 ^^;;

익명 사용자의 이미지

말씀하신대로 일반적인 제어흐름에서 wait류를 호출해서 child가 끝나기
를 기다려서 처리하는 방법도 있겠고요,
wait에서 block되는 것이 바람직하지 않은 경우, 또는 busy waiting이 바
람직하지 않은 경우에는 시그널 핸들러에 등록해 놓고 SIGCHLD가 발생했
을 때 async하게 처리하는 방식도 있겠지요. 이 경우에는 signal이 중복
되어서 오는 경우에 (여러개의 SIGCHLD가 온 경우에) 나중에 온 것이 큐
잉되지 않을 수도 있으니까 시그널 핸들러에서 더이상 child5ㅏ 없을때까
지 non-block 모드로 wait를 불러주는 것을 권장하고 있습니다.
SIGCHLD 또는 SIGCLD 는 환경에 따라 동작하는 바가 미묘하게 틀린 경우
가 있으니 한번 정리해 두심 좋겠고요.

익명 사용자의 이미지


답변주셔서 정말로 감사합니다.
초보자인데, 유용하게 응용할 수 있게 됐군요.

댓글 달기

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