Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание и заврешение процесса... 
:(
    Опции темы
iPlay
Дата 16.3.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Нужно помочь реализовать программу, работающую согласно:

Родительский процесс создает дочерний процесс (fork()).
Дочерний процесс запускает новый образ процесса (exec()).
Родительский процесс посылает дочернему сигналы, определяющие вид завершения дочернего процесса:
1. Самостоятельное завершение.Дочерний процесс устанавливает обработчик этого сигнала при помощи sigaction(). Обработчик выводит сообщение о получении сигнала, после чего процесс завершается самостоятельно.
2. Завершение по сигналу.
3. Остановка по сигналу.

Ребята где про это почитать? Или киньте пример, хочу разобратся.
PM MAIL   Вверх
JackYF
Дата 16.3.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(iPlay @  16.3.2008,  10:44 Найти цитируемый пост)
Ребята где про это почитать?

маны. и гугл.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
iPlay
Дата 16.3.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



А примерчег есть?
PM MAIL   Вверх
MAKCim
Дата 16.3.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



iPlay, 
Цитата(iPlay @  16.3.2008,  11:44 Найти цитируемый пост)
1. Самостоятельное завершение.Дочерний процесс устанавливает обработчик этого сигнала при помощи sigaction(). Обработчик выводит сообщение о получении сигнала, после чего процесс завершается самостоятельно.

не получится
после execve() все адреса обработчиков сигналов процесса устанавливаются в SIG_DFL

Добавлено через 6 минут и 11 секунд
Цитата(iPlay @  16.3.2008,  12:49 Найти цитируемый пост)
А примерчег есть? 

пример чего?
твоей программы?  smile 
за тебя никто ничего писАть не будет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
iPlay
Дата 16.3.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



ЗА МЕНЯ ПИСАТЬ НЕ НАДО!!!! Я просил пример работы с процессами.(У вас тут синдром наверно "Напиши за меня программу")
PM MAIL   Вверх
MAKCim
Дата 16.3.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



iPlay, 
Код

pid_t pid = fork(); /* создание процесса */
if (pid == 0) { /* дочерний процесс */
    struct sigaction action;
    /* инициализируем action */
    sigaction(<СИГНАЛ>, &action, NULL); /* установка обработчика сигнала */
...
} else if (pid < 0) { /* ошибка создания процесса */
...
}
/* родительский процесс */
kill(pid, <СИГНАЛ>); /* посылаем сигнал дочернему процессу */


Добавлено через 2 минуты и 31 секунду
Цитата(iPlay @  16.3.2008,  13:12 Найти цитируемый пост)
ЗА МЕНЯ ПИСАТЬ НЕ НАДО!!!! Я просил пример работы с процессами.(У вас тут синдром наверно "Напиши за меня программу") 

1. Вопросы должны быть конкретными (под определение "пример работы с процессами" подходит много всего)
2. Из-за невыполнения п. 1, складывается впечатление о том, что просят написать программу



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
iPlay
Дата 16.3.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Спасибо. 
MAKCim.

Добавлено через 31 секунду
Если еще появятся вопросы, конкретно спрошу.
PM MAIL   Вверх
iPlay
Дата 28.3.2008, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Значит написал два процесса. Вот первый в нем реализована послыка процессу дочернему сигналов.
Код

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <curses.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

pid_t   child_pid;

void PrintMenu()
{
 int exit=0;
  
  char ch;
  printf("1. Send SIGINT signal\n");
  printf("2. Send SIGHUP signal\n");
  printf("3. Send SIGTSTP signal\n");
  printf("Enter number >> ");
  scanf("%c",&ch);
  getchar();
  
  switch(ch)
  {  
    case '1': { kill(child_pid ,SIGINT); break;} 
    case '2': { kill(child_pid ,SIGHUP); break;}
    case '3': { kill(child_pid ,SIGTSTP); break;}
   }
     
 }



int main(int argc, char *argv[])
{
 child_pid = fork();
 if (child_pid !=0) 
     {
       int child_status;
        PrintMenu();
    
    waitpid(child_pid,&child_status,WUNTRACED);
        
    if (WIFEXITED(child_status) ) printf("Child_Process exited normally, exit status= %i\n",WEXITSTATUS(child_status));
    
    if (WIFSTOPPED(child_status) ) printf("Child_Process stopped, number  of stop signal= %i\n",WSTOPSIG(child_status));
    
    if (WIFSIGNALED(child_status) ) printf("Child_Process terminated, number  of term signal= %i\n",WTERMSIG(child_status));
        
     }
 else { 
         execve("ex",NULL,NULL);
       } 
   
  return EXIT_SUCCESS;
}



Но есть еще и второй процесс его вызывает первый ex называется. Процесс ex должен заблокировать сигнад SIGINT.
Код

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <curses.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>


void SigHandler(int signal)
{
  printf("SIG_INT Blocked!!!\n");
 
  struct sigset_t s;
  sigemptyset(&s);
  sigaddset(&s,SIGINT);
 
  struct sigaction sa;
  sa.sa_mask=s;
    
  
  exit(0);
  
}


int main(int argc, char *argv[])
{
      struct sigaction sigact;
      sigact.sa_handler = &SigHandler;
  
      sigaction(SIGINT,&sigact,NULL); 
      while ( 1 )  
      { 
      }
       
  return EXIT_SUCCESS;
}



Пытаюсь блокировку реализовать но не получается. Что не так?

Это сообщение отредактировал(а) iPlay - 28.3.2008, 19:05
PM MAIL   Вверх
MAKCim
Дата 28.3.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(iPlay @  28.3.2008,  19:04 Найти цитируемый пост)
Пытаюсь блокировку реализовать но не получается. Что не так?

какой результат выполнения программы?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
iPlay
Дата 29.3.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Нужно чтобы второй процесс ("ex") заблокировал сигнал SIGINT который посылает ему процесс первый . 

P.S. И еще у меня в задание написано вот так  "В дочернем процессе заблокируйте SIGINT, затем определите, ожидает ли доставки сигнал SIGINT" что означает "определите, ожидает ли доставки сигнал SIGINT"?
PM MAIL   Вверх
MAKCim
Дата 29.3.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(iPlay @  29.3.2008,  10:59 Найти цитируемый пост)
Нужно чтобы второй процесс ("ex") заблокировал сигнал SIGINT который посылает ему процесс первый . 

Код

int main(int argc, char *argv[])
{
 sigset_t sigset;
 sigemptyset(&sigset);
 sigaddset(&sigset, SIGINT);
 sigprocmask(SIG_BLOCK, &sigset, NULL);
 child_pid = fork();
 if (child_pid !=0) 
     {
       sigprocmask(SIG_UNBLOCK, &sigset, NULL);
       int child_status;
        PrintMenu();
    
    waitpid(child_pid,&child_status,WUNTRACED);
        
    if (WIFEXITED(child_status) ) printf("Child_Process exited normally, exit status= %i\n",WEXITSTATUS(child_status));
    
    if (WIFSTOPPED(child_status) ) printf("Child_Process stopped, number  of stop signal= %i\n",WSTOPSIG(child_status));
    
    if (WIFSIGNALED(child_status) ) printf("Child_Process terminated, number  of term signal= %i\n",WTERMSIG(child_status));
        
     }
 else { 
         execve("ex",NULL,NULL);
       } 
   
  return EXIT_SUCCESS;
}

Цитата(iPlay @  29.3.2008,  10:59 Найти цитируемый пост)
"В дочернем процессе заблокируйте SIGINT, затем определите, ожидает ли доставки сигнал SIGINT" что означает "определите, ожидает ли доставки сигнал SIGINT"? 

Код

int main(int argc, char *argv[])
{
      sigset_t sigset;
      while (1)  
      { 
          if (sigpending(&sigset) >= 0 && sigismember(&sigset, SIGINT) == 1)
              puts("SIGINT is pending!");
      }
       
  return EXIT_SUCCESS;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.