Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Создание и заврешение процесса...


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

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

Ребята где про это почитать? Или киньте пример, хочу разобратся.

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

маны. и гугл.

Автор: iPlay 16.3.2008, 12:49
А примерчег есть?

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

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

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

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

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

Автор: MAKCim 16.3.2008, 13:16
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, складывается впечатление о том, что просят написать программу

Автор: iPlay 16.3.2008, 15:57
Спасибо. 
MAKCim.

Добавлено через 31 секунду
Если еще появятся вопросы, конкретно спрошу.

Автор: iPlay 28.3.2008, 19:04
Значит написал два процесса. Вот первый в нем реализована послыка процессу дочернему сигналов.
Код

#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;
}



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

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

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

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

P.S. И еще у меня в задание написано вот так  "В дочернем процессе заблокируйте SIGINT, затем определите, ожидает ли доставки сигнал SIGINT" что означает "определите, ожидает ли доставки сигнал SIGINT"?

Автор: MAKCim 29.3.2008, 11:46
Цитата(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;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)