2017-01-21 15 views
1

мне нужно изменить PGID моего родительского процесса, так что я сделал что-то вроде этого:Невозможно изменить GID процесса

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#define KIDS 10 

int main() 
{ 
    struct timespec a = {10, 0}; 
    int pid; 
    int* pids = (int*) calloc(KIDS, sizeof(int)); 
    int argument = 0; 
    int procNumber; 

    for (procNumber = 0; procNumber < KIDS; procNumber++) { 
     pid = fork(); 
     argument = procNumber; 
     if (pid == 0) 
      break; 
     pids[procNumber] = pid; 
    } 

    if (pid == 0) { 
     // child stuff 
    } else { 
     printf("My group: %d\n", getpgrp()); 
     if (setpgid(0, 6654) == -1) 
      perror("setpgid() error:"); 
     printf("My new group: %d\n", getpgrp()); 
    } 

    nanosleep(&a,NULL); 
    free(pids); 

    return 0; 
} 

И я получаю Operation not permitted ошибку.

Что делать, чтобы избежать этой ошибки и изменить groupid процесса?

ответ

1
if(setpgid(0,6654)==-1) 
    perror("setpgid() error:"); 

Я думаю, что ошибка означает «была предпринята попытка переместить процесс в группу процессов, в другом сеансе»

Итак:

[[email protected] test_c]# sleep 10000 & 
[2] 2922 

я начинаю новый процесс, который Pid это 2922 в моем терминале, что означает, что его идентификатор группы процессов также равен 2922.

Затем я меняю исходный код if(setpgid(0,6654)==-1) на if(setpgid(0,2922)==-1), тонкий gs работает.

+1

Но в человеке я прочитал: «setpgid() устанавливает PGID процесса, заданного pid to pgid. Если pid равно нулю, тогда используется идентификатор процесса вызывающего процесса. " – annamataris

+0

Есть ли способ сделать это автоматически? Я имею в виду, когда я создаю процесс сна, используя popen, у него есть тот же GPID. Есть ли какое-нибудь разрешение? – annamataris

2

Сообщение Operation not permitted ошибка связана с кодом EPERM ошибки, которые в соответствии с man 2 setpgid (со ссылкой):

EPERM

была сделана попытка переместить процесс в группу процессов в в другой сеанс или изменить идентификатор группы процессов одного из дочерних элементов вызывающего процесса, а ребенок был в другом сеансе или изменить идентификатор группы процессов лидера сеанса (setpgid(), setpgrp()).

Таким образом, кажется, что есть 3 разные объяснения ошибки вы получаете:

  1. Вы пытаетесь переместить процесс в группу процессов, в другом сеансе.

  2. Вы пытаетесь изменить PGID ребенка, который находится в другом сеансе.

  3. Вы пытаетесь изменить PGID лидера сеанса.

Случаи 2 и 3 не имеют отношения к вашей проблеме, поэтому я предполагаю, что вы в первом случае. Если 6654 выбрано случайным образом, может быть, что группа 6654 процесса находится в другом сеансе.

Вы можете проверить это работает что-то вроде $ ps eajx и проверки SID поля вывода для каждого из процессов, в том числе группы процессов 6654.