자식 프로세서의 pid를 알고 싶은데...

koonpal의 이미지

fork 함수를 사용하여...

자식 프로세서를 생성하였는데...

부모 프로세서에서 자식프로세서의 pid를 알고 싶거든요...

어떻게 하면 되죠...^^;

ageldama의 이미지

fork()의 되돌림값이요.

자식은 0을 되돌려 받고, 부모에게는 자식의 pid를.

----
The future is here. It's just not widely distributed yet.
- William Gibson

koonpal의 이미지

그건 아는데요...

child도 자신의 pid를 가지잖아요...

부모 pid + 1 이 child pid 라고 생각을 했는데...

ps를 찍어 보니 다른 경우도 있더라고요...

좀 가르쳐 주세요...

tifler의 이미지

pid_t pid;
pid = fork();
if(pid == 0) 
    pid = getpid(); /* child's pid on child process*/
else if(pid > 0)
    ; /* pid already indicates child's pid */
else /* fork() failed */
    ;

/***********************
* while(1) sleep(INFINITE);
***********************/

불량청년의 이미지

음... 질문의 요지를 잘 이해를 못하겠지만,

getpid(); 나 getppid(); 함수를 사용하셔요.

getppid();함수는 부모의 프로세스를

getpid();는 현재 프로세스를 리턴합니다.

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

stoneshim의 이미지

Quote:
부모 pid + 1 이 child pid 라고 생각을 했는데...

ps를 찍어 보니 다른 경우도 있더라고요...

UNIX 시스템에서 프로세스가 생성될 때 할당되는 pid 값은 현재 시스템에서 사용되지 않고 있는 pid 값중 가장 작은 값이 할당되는 것으로 알고 있습니다.

parent process가 생성된 시점과 parent가 fork()를 호출한 시점 사이에 시스템에서 프로세스가 생성되거나 종료한 내용이 없다면 child의 pid는 parent의 pid+1이 될 것입니다.
하지만 그 시점 사이에 시스템에서 새로운 프로세스가 생성되었거나 혹은 parent pid보다 작은 값을 자신의 pid로 가지는 프로세스가 종료하였다면 child process의 pid값은 parent + 1이 아니게 됩니다.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

송지석의 이미지

stoneshim wrote:
Quote:
부모 pid + 1 이 child pid 라고 생각을 했는데...

ps를 찍어 보니 다른 경우도 있더라고요...

UNIX 시스템에서 프로세스가 생성될 때 할당되는 pid 값은 현재 시스템에서 사용되지 않고 있는 pid 값중 가장 작은 값이 할당되는 것으로 알고 있습니다.

parent process가 생성된 시점과 parent가 fork()를 호출한 시점 사이에 시스템에서 프로세스가 생성되거나 종료한 내용이 없다면 child의 pid는 parent의 pid+1이 될 것입니다.
하지만 그 시점 사이에 시스템에서 새로운 프로세스가 생성되었거나 혹은 parent pid보다 작은 값을 자신의 pid로 가지는 프로세스가 종료하였다면 child process의 pid값은 parent + 1이 아니게 됩니다.


태클 거는 것은 아니지만 프로세스 번호는 사용되지 않고 있는 pid값중 가장 작은 값으로 할당 된다는 말은 약간 어폐가 있는 것 같습니다.
1번 부터 순차적으로 번호를 할당해주는 것으로 알고 있습니다. (적어도 리눅스에서는)

1번은 init 프로세스이고 그 이후에 생성되는 프로세스들은 실행된 순서대로 2,3,4... 로 번호가 매겨집니다. 생성됐던 프로세스가 끝나면 그 번호는 비워둔 채 남겨지죠.
이런식으로요.
PID TTY TIME CMD
1 ? 00:00:03 init
2 ? 00:00:00 keventd
3 ? 00:00:00 kapmd
4 ? 00:00:00 ksoftirqd_CPU0
5 ? 00:00:11 kswapd
6 ? 00:00:02 bdflush
7 ? 00:00:00 kupdated
8 ? 00:00:00 mdrecoveryd
12 ? 00:00:05 kjournald
87 ? 00:00:00 khubd
180 ? 00:00:00 kjournald
556 ? 00:00:00 syslogd
561 ? 00:00:00 klogd
577 ? 00:00:00 portmap

쉘 명령도 한번 실행될 때마다 프로세스를 하나씩 생성시키고 종료하기 때문에 초기화가 긴 프로그램을 백그라운드로 실행시키고 ls나 ps를 실행시켜보면 (확실히)중간이 비게 됩니다. 아래처럼요..
529 0 6776 S test
532 0 6776 S test
533 0 6776 S test
534 0 6776 S test
535 0 1508 R ps

그런데 제 경우는 프로그램을 실행시켜보면 parent 프로세스와 child 사이에 pid가 1개는 보통 빠져있더군요.
저도 프로세스를 생성하는 과정에서 일어나는 내용에 대해서는 자세히 모르기 때문에 거기까지는 정확히 얘기할 수 없지만 어쨌든 프로세스 번호는 생성되는 순서대로 주욱 번호를 붙여주네요.

stoneshim의 이미지

예. 제가 잠시 착각했습니다.

프로세스 내에서 fd값이 할당되는 것과 혼동하는 바람에 사실과 다른 내용을 썼군요... 죄송합니다.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

댓글 달기

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