Конфликта нет; процесс по умолчанию будет находиться в уникальной группе процессов, которая является группой процессов его родителя:
$ cat pg.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
fork();
printf("pid=%d pgid=%d\n", getpid(), getpgrp());
}
$ make pg
cc pg.c -o pg
$./pg
pid=12495 pgid=12495
pid=12496 pgid=12495
$
fork
разделяет наш процесс на родительский(12495
)и дочерний (12496
), и дочерний процесс принадлежит к уникальной группе процессов родителя(12495
). bash
отклоняется от этого, потому что вызывает дополнительные системные вызовы:
$ echo $$
12366
$
А потом в другом терминале запускаем:
$ strace -f -o blah -p 12366
А потом обратно в первый терминал:
$./pg
pid=12676 pgid=12676
pid=12677 pgid=12676
$
Затем мы контролируем+c strace
и проверяем системные вызовы:
$ egrep 'exec|pgid' blah
12366 setpgid(12676, 12676) = 0
12676 setpgid(12676, 12676 <unfinished...>
12676 <... setpgid resumed> ) = 0
12676 execve("./pg", ["./pg"], [/* 23 vars */]) = 0
12676 write(1, "pid=12676 pgid=12676\n", 21 <unfinished...>
12677 write(1, "pid=12677 pgid=12676\n", 21 <unfinished...>
bash
использовал вызов setpgid
для установки группы процессов, тем самым помещая наш процесс pg
в группу процессов, не связанную с группой процессов оболочки.(setsid(2)
— еще один способ настроить группу процессов, если вы ищете системные вызовы.)
В современных Windows есть так называемый быстрый запуск, который вызывает проблемы при двойной загрузке.
Если вы используете современную Windows (8 или 10 )и двойную загрузку, вы должны оставить ее выключенной