LINUX.ORG.RU

[C++]-UNIX - sigprocmasc

 


0

2

Привет всем, я с проблемой такого плана :«Процесс создаёт дочерний процесс. Дочерний процесс должен игнорировать все сигналы кроме пользовательского(посылаемого родителем) по которому он должен закончится(использовать ф-ию sigprocmask)» Я не очень разбираюсь , но как понял нужна структура sigaction... не знаю как правильно её использовать да и sigprocmask--не понимаю зачем она здесь(видимо, дополнительное условие преподавателя) Большая просьба помогите с написанием программы. ОЧень большая просьба отпишитесь кому легко программирование даётся

<Опустим диррективы>

void catch_sig(int sig_num)

{signal(SIGUSR1,catch_sig) }

int main()

{pid_t ppid,pid; sigset_t mask;

//ещё перемменные и видимо структура нужна??//

pid=fork();

sigfillset(&mask);

sigdelset(&mask,SIGUSR1);

//здесь ,видимо нужно работать с fillset??//



Последнее исправление: liberty (всего исправлений: 2)

За пару тыщ могу сделать и объяснить, как оно работает.

jabber: delirium666 at jabber.ru icq: two four 3 4 nine 4 three 0 seven

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от liberty

Ты не понял, за бесплатно тебе здесь никто ничего делать не будет, ну по-крайней мере большинство. Лично МНЕ это сделать не сложно: тут работы на 10 минут, НО если ты, обучаясь в высшем учебном заведении, не можешь освоить такие простые вещи. Про sigprocmask я молчу, мне хватило этого:

написать нужно как вы поняли через текстовый документ с ".С"-расширением. То есть работать не через терминал а в документе.

И при этом хочешь сдать зачёт, и (в дальнейшей перспективе) получить диплом и статус специалиста, то будь готов платить. Раз уж ты даже поленился прочитать хоть какую-то литературу по теме и хотя бы погуглить примеры кода.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

Кстати, обрати внимание, я предложил не просто написать тебе пару десятков строчек кода. Я предложил:

и объяснить, как оно работает.

Что заняло бы больше времени, чем написание, учитывая твой стартовый уровень знаний. А 2к - это минимальная цена, за которую вообще кто-либо будет делать что-либо.

Кароче,

сам тогда поробую как нибудь

дерзай.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

я дальше пояснил"Может я щас для многих очевидное написал)))" Просто я читал сообщения и подумал что возможно такая задача решается через терминал... Значит ошибался)

liberty
() автор топика
Ответ на: комментарий от liberty

Товарищ, если бы ты пришёл с конкретным вопросом типа: «Мне надо написать курсач, опыта у меня мало, я читал это, вот и это, но не всё понял. Не понимаю, почему вот так <кусок кода> работает не так, как я ожидал», - то тебе уже ответили и посоветовали, что написать. А пока это выглядит, как: «Напишите мне курсач, только денег у меня нет, сам я ничего не знаю и учить не буду.»

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

DELIRIUM

А 2к - это минимальная цена, за которую вообще кто-либо будет делать что-либо.

Ну… Если у liberty есть сиськи и он умеет варить кофе, то я мог бы сделать это и бесплатно (в смысле за кофе), но вообще — да, тема для Job.

KblCb ★★★★★
()
Ответ на: комментарий от DELIRIUM

ок вот не чего хватает меня пока :

<Опустим диррективы> void catch_sig(int sig_num) {signal(SIGUSR1,catch_sig) } int main() {pid_t ppid,pid; sigset_t mask;

//ещё перемменные и видимо структура нужна??// pid=fork(); sigfillset(&mask); sigdelset(&mask,SIGUSR1);

//здесь ,видимо нужно работать с fillset??//

Всё что получается пока почитаю ещё может дополню ты не прав я читаю книги просто читаю но не понимаю как правильно всё использовать, да и лечение меня из колеи выбило.

liberty
() автор топика
Ответ на: комментарий от KblCb

> лежаЛ в госпитале

есть сиськи и ОН

Оу... неее, лучше 2к =)

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от liberty

Осиль хотя бы LORCODE, а то код читать невозможно

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от liberty

<Опустим диррективы>

void catch_sig(int sig_num)

{signal(SIGUSR1,catch_sig) }

int main()

{pid_t ppid,pid; sigset_t mask;

//ещё перемменные и видимо структура нужна??//

pid=fork();

sigfillset(&mask);

sigdelset(&mask,SIGUSR1);

//здесь ,видимо нужно работать с fillset??//

liberty
() автор топика
Ответ на: комментарий от liberty

После заполнения sigset_t надо вызвать sigprocmask(), установив первый параметр в SIG_BLOCK.

Вот тут (одна из первых ссылок в гугле) вроде нормально расписали, как работает sigprocmask():

http://stackoverflow.com/questions/25261/help-with-sigprocmask

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от liberty

Да, по поводу struct sigaction: её видимо предполагалось использовать вместо signal() для задания обработчика сигнала.

Сходу пруф не дам, но вроде Рочкинд пишет, что интерфейс signal() устарел и советует вместо него везде использовать sigaction().

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

хм я так понял что: int sigaction(int signo,..............упустим))

signo---Надо будет связать с родительским сигналом????

Или я опять бред несу??

liberty
() автор топика

ОЧень большая просьба отпишитесь кому легко программирование даётся


а кому оно легко даётся?!

Boy_from_Jungle ★★★★
()
// @author edimchesnokcherezrot
// @date 2011-21-44
// @sobaka kusaka
// @license closed and then opened then then closed source and not source
// @address - Maingstful str, CA, Boston 11712, MTT, Pars road LE.
// @pipis - manchester style.
// @mindobra - odobreno.

#include <signal.h>

void disableSignals ()
{

    // POSIX signals.
    sigset_t newset;
    sigemptyset(&newset);


    sigaddset(&newset, SIGHUP);
    sigaddset(&newset, SIGUSR1);
    sigaddset(&newset, SIGUSR2);
    /// .......                 

    sigprocmask(SIG_BLOCK, &newset, 0);

    signal ( SIGTERM, term_handler );
    signal ( SIGINT, term_handler );
}



int main ( void )
{
   disableSignals();
   return 0;
}

kiverattes ★☆
()
Ответ на: комментарий от DELIRIUM

> за бесплатно тебе здесь никто ничего делать не будет, ну по-крайней мере большинство.

Ну вообще советы здесь, бывает, дают грамотные, если вопрос разумный, а не из разряда man something. Хотя здесь это не тот случай явно.:)

geekless ★★
()
Ответ на: комментарий от kiverattes
    sigaddset(&newset, SIGHUP);
    sigaddset(&newset, SIGUSR1);
    sigaddset(&newset, SIGUSR2);
    /// .......                 

butthurt...

Вон даже ТС с самого начала догадался заюзать sigfillset(). Ну и да, выше уже упоминалось, что signal() лучше не использовать. На это есть две основных причины:

1) В момент вызова хендлера сигнал не блокируется, и несколько «одновременных» сигналов могут вызвать падение.

2) При каждом получении сигнала реакция сбрасывается на дефолтную.

Оба этих момента не актуальны для sigaction().

DELIRIUM ☆☆☆☆☆
()

Я бы посоветовал, man fork. По коду, без этого у тебя ничего не получится, потом уже можно к сигналам переходить.

goose
()

void main()

{ pid_t pid;

sigset_t x;

static struct sigaction act;

act.sa_handler=par_act;

sigfillset(&x);

sigdellset(SIGUSR1,&x);

sigprocmasc(SIG_BLOCK,&x,NULL);

switch(pid=fork())

case 1:perror(«ERROR»);

case 0:sigaction(SIGUSR1,&act,NULL);

default: sleep(5);

kill(pid,SIGUSR1);

printf(«Polzovatelskii signal otpravlen

do4ernemu,razblokirovka vseh signalov»);

void par_act(int sig)

{printf(«Do4ernii process razblokiruet vse signali»); sigprocmask(SIG_UNBLOCK,&x,NULL);

wait();

}}

liberty
() автор топика
Ответ на: комментарий от liberty

как то так но ето не совсем то что надо кто подскажет как сделать так чтобы соответствовало условию задачи---как ЗАВЕРШИТЬ ПРОЦЕСС???

liberty
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.