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() );
}
}
Re: setpgid 함수 관련 질문입니다.
보통 자식프로세스의 그룹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() );
}
}
댓글 달기