setpgid 함수 관련 질문입니다.

익명 사용자의 이미지

다음소스는 fork직후에 부모프로세스에서 setpgid( 0 , pid)를 통해
부모프로세스Group id를 자식프로세스id로 바꾸려하는데
이것이 -1로 실패하는 이유를 모르겠습니다.

#include
#include
#include

int main()
{
int ret;
pid_t pid;
fprintf( stderr , "sid %d , pid %d , gid %d\n" ,
getsid(0) , getpid() , getpgrp() );

if ( ( pid = fork()) < 0 )
perror("");
else if ( pid == 0 )
{
sleep( 1 );
fprintf( stderr ,
"Child sid %d , pid %d , gid %d ppid %d\n" ,
getsid(0) , getpid() , getpgrp() , getppid() );
}
else
{
/* 호출프로세스 자신의 Group id를 자식프로세스id로 바꾼다. */
ret = setpgid( 0 , pid ); /* <----- 에러 발생합니다. */
fprintf( stderr , "setpgid ret %d \n" , ret ); /* ret == -1 */
fprintf( stderr , "Parent sid %d , pid %d , gid %d\n" ,
getsid(0) , getpid() , getpgrp() );
}
}

익명 사용자의 이미지


보통 자식프로세스의 그룹ID를 변경하는 것 같은데,
부모프로세스의 프로세스그룹ID를 변경하시네요? ^^

프로세스그룹ID를 변경하기 위해서는 몇가지가 만족되어야 하는데,
그 중 하나가 해당 프로세스 그룹이 존재하고 있어야 한다는 것입니다.
seeker님께서 작성하신 코드를 보니, 부모프로세스의 프로세스그룹ID를
자식프로세스ID로 바꾸시려고 하는데, 해당 시점에서는 자식프로세스ID를
프로세스그룹ID로 가지고 있는 프로세스그룹이 없습니다.
(사실, 코드내에 이를 수행해 주는 부분이 없지요.)

작성하신 setpgid() 문 이전에
setpgid(pid, pid);
와 같은 호출을 하셔서, 자식프로세스id를 프로세스그룹id로 가지는
프로세스그룹을 생성하신 후에 호출을 하시면 문제없이 수행될것입니다.

음.. 그리고 혹시 job control 지원을 위한 경우라면,
부모프로세스가 아니라 자식프로세스의 프로세스그룹id를 변경하는것이
맞고요, 이 경우 race condition의 문제 때문에 부모프로세스와
자식프로세스에서 동시에 setpgid()를 불러주는 것이 보다 안전한
방법이라고 스티븐스 아저씨가 말씀하시네요.

seeker wrote..
다음소스는 fork직후에 부모프로세스에서 setpgid( 0 , pid)를 통해
부모프로세스Group id를 자식프로세스id로 바꾸려하는데
이것이 -1로 실패하는 이유를 모르겠습니다.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
int ret;
pid_t pid;
fprintf( stderr , "sid %d , pid %d , gid %d\n" ,
getsid(0) , getpid() , getpgrp() );

if ( ( pid = fork()) < 0 )
perror("");
else if ( pid == 0 )
{
sleep( 1 );
fprintf( stderr ,
"Child sid %d , pid %d , gid %d ppid %d\n" ,
getsid(0) , getpid() , getpgrp() , getppid() );
}
else
{
/* 호출프로세스 자신의 Group id를 자식프로세스id로 바꾼다. */
ret = setpgid( 0 , pid ); /* <----- 에러 발생합니다. */
fprintf( stderr , "setpgid ret %d \n" , ret ); /* ret == -1 */
fprintf( stderr , "Parent sid %d , pid %d , gid %d\n" ,
getsid(0) , getpid() , getpgrp() );
}
}

댓글 달기

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