IPCPOSIX на примере QNX Neutrino (Отчет о выполнении научно-исследовательской работы), страница 3

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

void (*mysig(int sig, void(*handler)(void))) (int)

{

      struct sigaction act,oldact;

      act.sa_handler=handler;

      sigemptyset(&act.sa_mask);

      sigaddset(&act.sa_mask, SIGINT);

      act.sa_flags=0;

      if(sigaction(sig, &act, &oldact) < 0)

      {

            return(SIG_ERR);

      }

      return(oldact.sa_handler);

}

void sigusr_1(void)

{

      printf("SIGUSR1, SIGINT blocked.....\n");

      kill(getpid(), SIGINT);

      sleep(20);

      printf("end\n");

}

void sigusr_2(void)

{

      printf("SIGUSR2, SIGINT blocked.....\n");

      kill(getpid(), SIGINT);

      sleep(20);

      printf("end\n");

}

int main( void )

{

      mysig( SIGUSR1, sigusr_1);

      mysig( SIGUSR2, sigusr_2);  

      while(1) sleep(1);

      return 0;

}

Результаты:

# ./sigact&

[1] 2146341

# kill -s  SIGUSR1 2146341

# SIGUSR1, SIGINT blocked.....

# kill -s  SIGUSR2 2146341

# SIGUSR2, SIGINT blocked.....

# kill -s  SIGINT 2146341

# ps -l| grep sig

00000200 -     0    2146341     856108  -  10   0    -  636K -     ?        00:0

0:00 sigact

# end

# ps -l| grep sig

[1] + Interrupt            ./sigact

#

4. Сравните обработчики надежных и ненадежных сигналов.

Ненадежные сигналы - это те, для которых вызванный однажды обработчик сигнала не остается. Такие "сигналы-выстрелы" должны перезапускать обработчик внутри самого обработчика, если есть желание сохранить сигнал действующим. В случае надежных сигналов при отправке сигнала SIGINT в момент работы другого обработчика, блокирующего этот сигнал, по окончании работы этого обработчика запрос выполняется и процесс завершается (sigaction  содержит аргумент old_action, с помощью которого можем сохранить, старое действие для сигнала, и восстановить его позже, если необходимо).

III. Неименованные каналы

Создайте неименованный канал в файле pipe.c  посредством системного вызова pipe(2), который возвращает 2 файловых дескриптора filedes[0] для записи в канал и для чтения из канала filedes[1]. Доступ к дескрипторам канала может получить как процесс, вызвавший pipe() , так и его дочерние процессы.

Используйте следующий фрагмент кода:

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

 if((err = pipe(filedes)) < 0)
 {
  printf("Father : can't create pipe\n");
  exit(-1);
 }
 printf("Father : pipe is created\n");

Организуйте программу так, чтобы процесс-потомок открывал на чтение произвольный текстовый файл и записывал считываемую из него информацию в созданный  неименованный канал. В функции процесса-родителя будет входить считывание из канала на стандартный вывод. Не забудьте о закрытии дескрипторов после работы с каналом.
pipe.c

#include <stdio.h>

#include <unistd.h>

int main (int argc, char* argv[])

{

      FILE *f_in;

      if(argc < 2)

      {

            printf("ERR!!! No file name!!!!");

            exit(1);

      };

      char *filename = argv[1];

      int filedes[2];

      char buf[256];

      char buf_read[256];

      int pid,err;     

      if((err = pipe(filedes)) < 0)