Страниц: [1] 2
  Печать  
Автор Тема: группы процессов  (Прочитано 8069 раз)
mtr
Участник
*
Offline Offline

Сообщений: 8



Просмотр профиля
« : Августа 26, 2010, 01:32:33 pm »

Добрый день.
Столкнулся с проблемой при изменении группы процесса.
Вызов
setpgid( getpid(), 100 );
приводит к ошибке с описанием: «Operation not permitted»

пробовал также создать дочерний процесс с заданным номером группы вызовом spawn(..), он тоже завершился с ошибкой «Operation not permitted» вот фрагмент кода:

struct inheritance inherit;
inherit.flags = SPAWN_SEARCH_PATH|SPAWN_SETGROUP;
inherit.pgroup = 100;

spawn(argv[2], 0, 0, &inherit, argv+2, NULL);


если не ставить флаг SPAWN_SETGROUP, то функция выполняется успешно, но естественно группа дочернего процесса не устанавливается.

Работаю под 6.4.1, запускаю программы через qconn и из консоли эффект один и тот же, программы выполняются на arm процессоре.

Прошу уважаемых участников форума указать мне на то, что я делаю неправильно, и помочь решить проблему.
Записан
mtr
Участник
*
Offline Offline

Сообщений: 8



Просмотр профиля
« Ответ #1 : Августа 28, 2010, 02:09:21 pm »

Неужели никто из участников форума ничего не может сказать про установку группы процесса?.....
Записан
oder
Гость
« Ответ #2 : Августа 28, 2010, 03:18:24 pm »

Ну что такого сложного, чтоб самому страничку описания функции почитать?

EPERM
The calling process doesn't have sufficient privilege to set the process group id pgid on process pid.

Правей надо иметь побольше.
Записан
mtr
Участник
*
Offline Offline

Сообщений: 8



Просмотр профиля
« Ответ #3 : Августа 30, 2010, 09:57:29 am »

Цитировать
EPERM
The calling process doesn't have sufficient privilege to set the process group id pgid on process pid.
Это я как раз прочитал, но не понятно о каких правах идет речь если о правах доступа к файлу, то они rwx для всех
Код:
-rwxrwxrwx  1 0         0              7980 Aug 26  2010 sr
-rwxrwxrwx  1 0         0              7788 Aug 24  2010 ss
если нет то объясните пожалуйста о каких.
Записан
oder
Гость
« Ответ #4 : Августа 30, 2010, 01:11:27 pm »

Очевидно, программа не из под рута выполняется. Или, таки, из под рута?
Записан
mtr
Участник
*
Offline Offline

Сообщений: 8



Просмотр профиля
« Ответ #5 : Августа 30, 2010, 07:00:31 pm »

программа выполняется из под рута, на процессорной плате, никаких других пользователей в этой системе нет.
Записан
oder
Гость
« Ответ #6 : Августа 30, 2010, 07:39:47 pm »

Ну а пример из хелпа - он, практически, такой же - тоже не работает?
Записан
mtr
Участник
*
Offline Offline

Сообщений: 8



Просмотр профиля
« Ответ #7 : Августа 30, 2010, 09:02:03 pm »

запускаю как в хелпе
Код:
if( setpgid( getpid(), 0 ) == -1 ) perror( "setpgid" );
printf( "%d belongs to process group %d\n", getpid(), getpgrp() );
вывод в консоль:
Код:
77837 belongs to process group 77837
ошибки нет но группа как совпадала с ID процесса так и совпадает
ставлю номер группы 100
Код:
if( setpgid( getpid(), 100 ) == -1 ) perror( "setpgid" );
printf( "%d belongs to process group %d\n", getpid(), getpgrp() );
вывод в консоль:
Код:
setpgid: Operation not permitted
81933 belongs to process group 81933
группа опять не изменилась но теперь есть ошибка.
и наконец ставлю номер группы 1
Код:
if( setpgid( getpid(), 1 ) == -1 ) perror( "setpgid" );
printf( "%d belongs to process group %d\n", getpid(), getpgrp() );
вывод в консоль:
Код:
86029 belongs to process group 1
все удалось.
НО этот вариант мне не подходит потому что группы я хочу использовать для того чтобы посылать сигналы всем процессам только в этой группе, а функция kill() завершается с ошибкой если я посылаю сигнал первой группе т.е. вызываю kill(-1, sig);
killpg() тот же эффект.
Записан
oder
Гость
« Ответ #8 : Августа 30, 2010, 09:43:01 pm »

Ну, может, 100 - слишком большое число? Меньшие не пробовали?
Записан
mike
QOR.Moderator
*****
Offline Offline

Сообщений: 1186


Welcome to Lunatic Asylum.


Просмотр профиля WWW
« Ответ #9 : Августа 31, 2010, 08:21:35 am »

поглядел сырцы, EPERM возвращается в 3-х случаях
// If pid is a session leader or not in the same session return EPERM
// If this is not a process group at all, don't set it
// If no process group leader is not in same session return EPERM
Записан
oder
Гость
« Ответ #10 : Августа 31, 2010, 12:03:35 pm »

Тоесть, похоже на то, что группа 100 уже существует и она в системной сессии?
Записан
mtr
Участник
*
Offline Offline

Сообщений: 8



Просмотр профиля
« Ответ #11 : Августа 31, 2010, 01:25:16 pm »

Цитировать
Тоесть, похоже на то, что группа 100 уже существует и она в системной сессии?
не устанавливается никакая ни 2, ни 3, ни 100, ни 300000.

в хелпе есть фраза: "The process group ID of a session leader doesn't change" т.е. если процесс является лидером сессии то его группа не может быть изменена. как раз первый пункт
Цитировать
// If pid is a session leader or not in the same session return EPERM


Цитировать
поглядел сырцы, EPERM возвращается в 3-х случаях
как бы мне тоже поглядеть исходники этой setpgid? на qnx.com зарегистрирован но получить доступ к исходникам не смог. Sad(
Записан
mike
QOR.Moderator
*****
Offline Offline

Сообщений: 1186


Welcome to Lunatic Asylum.


Просмотр профиля WWW
« Ответ #12 : Августа 31, 2010, 01:30:44 pm »

как бы мне тоже поглядеть исходники этой setpgid? на qnx.com зарегистрирован но получить доступ к исходникам не смог. Sad(
теперь всё здесь http://community.qnx.com/sf/projects/qnx_source под отдельной лицензией
Записан
oder
Гость
« Ответ #13 : Августа 31, 2010, 01:31:47 pm »

Цитировать
Тоесть, похоже на то, что группа 100 уже существует и она в системной сессии?
не устанавливается никакая ни 2, ни 3, ни 100, ни 300000.

в хелпе есть фраза: "The process group ID of a session leader doesn't change" т.е. если процесс является лидером сессии то его группа не может быть изменена. как раз первый пункт
Цитировать
// If pid is a session leader or not in the same session return EPERM
Session leader - это процесс, который стартовал пользовательскую сессию при входе в систему. Нет?
Тоесть, простая прикладная программа, которую просто из шела запускают, лидером сессии не является.
Записан
mtr
Участник
*
Offline Offline

Сообщений: 8



Просмотр профиля
« Ответ #14 : Августа 31, 2010, 02:36:39 pm »

Цитировать
теперь всё здесь http://community.qnx.com/sf/projects/qnx_source под отдельной лицензией
спасибо. буду получать лицензию.

Цитировать
Session leader - это процесс, который стартовал пользовательскую сессию при входе в систему. Нет?
Тоесть, простая прикладная программа, которую просто из шела запускают, лидером сессии не является.
что такое сесесия и лидер сессии я не знаю, но когда взгляну на исходный код то будет понятно что под этим понимает setpgid.
Записан
Страниц: [1] 2
  Печать  
 
Перейти в: