@@ -517,7 +517,7 @@ child_exec(char *const exec_array[],
517
517
int errread , int errwrite ,
518
518
int errpipe_read , int errpipe_write ,
519
519
int close_fds , int restore_signals ,
520
- int call_setsid ,
520
+ int call_setsid , pid_t pgid_to_set ,
521
521
int call_setgid , gid_t gid ,
522
522
int call_setgroups , size_t groups_size , const gid_t * groups ,
523
523
int call_setuid , uid_t uid , int child_umask ,
@@ -611,6 +611,11 @@ child_exec(char *const exec_array[],
611
611
POSIX_CALL (setsid ());
612
612
#endif
613
613
614
+ #ifdef HAVE_SETPGID
615
+ if (pgid_to_set >= 0 )
616
+ POSIX_CALL (setpgid (0 , pgid_to_set ));
617
+ #endif
618
+
614
619
#ifdef HAVE_SETGROUPS
615
620
if (call_setgroups )
616
621
POSIX_CALL (setgroups (groups_size , groups ));
@@ -716,7 +721,7 @@ do_fork_exec(char *const exec_array[],
716
721
int errread , int errwrite ,
717
722
int errpipe_read , int errpipe_write ,
718
723
int close_fds , int restore_signals ,
719
- int call_setsid ,
724
+ int call_setsid , pid_t pgid_to_set ,
720
725
int call_setgid , gid_t gid ,
721
726
int call_setgroups , size_t groups_size , const gid_t * groups ,
722
727
int call_setuid , uid_t uid , int child_umask ,
@@ -769,7 +774,7 @@ do_fork_exec(char *const exec_array[],
769
774
child_exec (exec_array , argv , envp , cwd ,
770
775
p2cread , p2cwrite , c2pread , c2pwrite ,
771
776
errread , errwrite , errpipe_read , errpipe_write ,
772
- close_fds , restore_signals , call_setsid ,
777
+ close_fds , restore_signals , call_setsid , pgid_to_set ,
773
778
call_setgid , gid , call_setgroups , groups_size , groups ,
774
779
call_setuid , uid , child_umask , child_sigmask ,
775
780
py_fds_to_keep , preexec_fn , preexec_fn_args_tuple );
@@ -791,6 +796,7 @@ subprocess_fork_exec(PyObject *module, PyObject *args)
791
796
int p2cread , p2cwrite , c2pread , c2pwrite , errread , errwrite ;
792
797
int errpipe_read , errpipe_write , close_fds , restore_signals ;
793
798
int call_setsid ;
799
+ pid_t pgid_to_set = -1 ;
794
800
int call_setgid = 0 , call_setgroups = 0 , call_setuid = 0 ;
795
801
uid_t uid ;
796
802
gid_t gid , * groups = NULL ;
@@ -806,13 +812,13 @@ subprocess_fork_exec(PyObject *module, PyObject *args)
806
812
int allow_vfork ;
807
813
808
814
if (!PyArg_ParseTuple (
809
- args , "OOpO!OOiiiiiiiiiiOOOiOp :fork_exec" ,
815
+ args , "OOpO!OOiiiiiiiiii" _Py_PARSE_PID "OOOiOp :fork_exec" ,
810
816
& process_args , & executable_list ,
811
817
& close_fds , & PyTuple_Type , & py_fds_to_keep ,
812
818
& cwd_obj , & env_list ,
813
819
& p2cread , & p2cwrite , & c2pread , & c2pwrite ,
814
820
& errread , & errwrite , & errpipe_read , & errpipe_write ,
815
- & restore_signals , & call_setsid ,
821
+ & restore_signals , & call_setsid , & pgid_to_set ,
816
822
& gid_object , & groups_list , & uid_object , & child_umask ,
817
823
& preexec_fn , & allow_vfork ))
818
824
return NULL ;
@@ -1016,7 +1022,7 @@ subprocess_fork_exec(PyObject *module, PyObject *args)
1016
1022
pid = do_fork_exec (exec_array , argv , envp , cwd ,
1017
1023
p2cread , p2cwrite , c2pread , c2pwrite ,
1018
1024
errread , errwrite , errpipe_read , errpipe_write ,
1019
- close_fds , restore_signals , call_setsid ,
1025
+ close_fds , restore_signals , call_setsid , pgid_to_set ,
1020
1026
call_setgid , gid , call_setgroups , num_groups , groups ,
1021
1027
call_setuid , uid , child_umask , old_sigmask ,
1022
1028
py_fds_to_keep , preexec_fn , preexec_fn_args_tuple );
@@ -1081,7 +1087,7 @@ PyDoc_STRVAR(subprocess_fork_exec_doc,
1081
1087
"fork_exec(args, executable_list, close_fds, pass_fds, cwd, env,\n\
1082
1088
p2cread, p2cwrite, c2pread, c2pwrite,\n\
1083
1089
errread, errwrite, errpipe_read, errpipe_write,\n\
1084
- restore_signals, call_setsid,\n\
1090
+ restore_signals, call_setsid, pgid_to_set, \n\
1085
1091
gid, groups_list, uid,\n\
1086
1092
preexec_fn)\n\
1087
1093
\n\
0 commit comments