OpenSolaris

Printable Version Enter a New Search
Bug ID 6485375
Synopsis in same process group, parent set child as process group lead should succeed
State 10-Fix Delivered (Fix available in build)
Category:Subcategory kernel:brandz
Keywords
Responsible Engineer William Kucharski
Reported Against
Duplicate Of
Introduced In solaris_nevada
Commit to Fix snv_52
Fixed In snv_52
Release Fixed solaris_nevada(snv_52) , solaris_10u4(s10u4_01) (Bug ID:2144881)
Related Bugs
Submit Date 24-October-2006
Last Update Date 19-January-2007
Description
in a same process group, if parent want to set child as the group lead, it should succeed, see the case:

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

main()
{
        pid_t c_pid, p_pid, act_pid, exp_pid;
        int status;

        c_pid = fork();
        if(c_pid < 0){
                printf("fork fail\n");
                return 1;
        }else if(c_pid > 0){ //parent
                if (setpgid((pid_t)0, (pid_t)0) == -1)
                {
                        printf("PARENT: setpgid(0, 0) failed %d(%s)\n",
                                 errno, strerror(errno));
                }
                printf("PARENT: my child pid is %ld\n", (long)c_pid);
                printf("PARENT: my own pid is %ld\n", (long)getpid());

                if (setpgid((pid_t)c_pid, (pid_t)0) == -1)
                {
                        printf("PARENT: setpgid() failed %d(%s)", errno, strerror(errno));
                        printf("PARENT: setpgid(pid, 0) with pid = %ld", (long)c_pid);
                }
                printf("PARENT: make my child group lead\n");
                waitpid(c_pid, &status, 0);
                return 0;
        }else{ //child
                printf("CHILD: sleep for parent finish his job\n");
                sleep(10);
                act_pid = getpgrp();
                printf("CHILD: my current group pid=%ld\n", (long)act_pid);
                exp_pid = getpid();
                printf("CHILD: expected group pid=%ld\n", (long)exp_pid);
                if(act_pid != exp_pid)
                        printf("case FAIL!\n");
                else
                        printf("case PASS!\n");

                exit(0);
        }

        return 0;
}

run in native linux OS:
miin:/tmp> uname -a
Linux miin 2.4.21-4.ELsmp #1 SMP Fri Oct 3 17:52:56 EDT 2003 i686 i686 i386 GNU/Linux
miin:/tmp> ./setpgid_4
CHILD: sleep for parent finish his job
PARENT: my child pid is 6736
PARENT: my own pid is 6735
PARENT: make my child group lead
CHILD: my current group pid=6736
CHILD: expected group pid=6736
case PASS!


run in solaris global:
bash-3.00# uname -a
SunOS covete 5.11 onnv-gate:2006-10-23 i86pc i386 i86pc
bash-3.00# ./setpgid_4
CHILD: sleep for parent finish his job
PARENT: my child pid is 128452
PARENT: my own pid is 128451
PARENT: make my child group lead
CHILD: my current group pid=128452
CHILD: expected group pid=128452
case PASS!


run in linux zone:
[root@lxzone1 tmp]# ./setpgid_4
CHILD: sleep for parent finish his job
PARENT: my child pid is 128457
PARENT: my own pid is 128456
PARENT: make my child group lead
CHILD: my current group pid=128456
CHILD: expected group pid=128457
case FAIL!
Work Around
N/A
Comments
N/A