2014-10-17 4 views
1

C Linux изменение pgrp (группы процессов) во время выполнения программыLinux pgrp изменение (групповой процесс) во время выполнения программы гр

Есть кусок рабочего кода C, чтобы изменить свою собственную группу процессов во время выполнения программы. Возможно, кто-то может выполнить работу тестовой программы ниже.

Bash проверка:

# ps -opid,pgrp,cmd | grep <pid> 

C тестовая программа:

#include<stdio.h> 

int main(int argc, char *argv[]) { 

    pid_t mypid = getpid(); 
    printf ("issue: ps -opid,pgrp,cmd | grep %d\n", (int) mypid); 

    printf ("will change my pgrp in 10 sec\n"); 
    sleep (10); 

    // missing here is the "magic" statment to change current process group 

    printf ("issue: ps -opid,pgrp,cmd | grep %d\n", (int) pid); 

    sleep (1000); 
} 

ответ

4

От человека страниц setsid.

http://linux.die.net/man/2/setsid

setsid() создает новый сеанс, если вызывающий процесс не является лидером группы процессов. Вызывающий процесс является лидером нового сеанса, лидером группы процессов новой группы процессов и не имеет управляющего терминала.

или вы можете изменить группу своего процесса с помощью системного вызова setpgid(). На страницах мужских setpgid http://man7.org/linux/man-pages/man2/setpgid.2.html

setpgid() устанавливает PGID процесса, указанного ПИД PGID. Если pid равно нулю, то используется идентификатор процесса вызывающего процесса. Если pgid равно нулю, то PGID процесса, заданного pid, делается так же, как и идентификатор процесса.

, но обязательно, чтобы обе группы процессов принадлежали к одному сеансу, то есть группе, от которой вы переходите, и группе, в которую вы переходите. Вот пример кода, который изменяет группу процессов с вне использования setsid() и вилки():

int main() 
{ 
    pid_t ppgid = 0; 
    pid_t mypid = getpid(); 
    pid_t ppid = getppid(); 
    printf("My pid is %d and my pgid is %d\n", getpid(), getpgid(mypid)); 
    ppgid = getpgid(ppid); 
    printf("My parent's pid is %d and his pgid is %d\n", ppid, ppgid); 

    setpgid(mypid, ppgid); 

    printf("Now my pgid is changed to my parent's pgid(%d)\n", getpgid(mypid)); 

    return 0; 
} 
+1

попробовать тестовую программку, и вы увидите, он не будет работать – user2050516

+1

Thats, вероятно, потому, что вы обрабатываете уже группа лидер. Я не знаю, решает ли эта проблема вашу проблему, но вы можете изменить идентификатор группы процессов, развязав свой процесс, позволить родителям умереть и вызвать setid в вашем дочернем процессе. Таким образом, ваш дочерний процесс не будет лидером группы и изменит его идентификатор группы. –

+1

Да, это способ демонстрации процесса, например, который я тестировал. Мне любопытно, могу ли я изменить существующий процесс без наложения ... – user2050516

Смежные вопросы