Замена обработчика прерываний. Замена обработчика средствами DOS. Функция получения нулевого обработчика, страница 2

    int flag = kill(getppid(),SIGUSR1);

    if (flag == -1)

        printf("SON: Can't send a signal!\n");

    else

        printf("SON: Signal was successfully send!\n");

    return 0;

}

6.  Механизм надежных сигналов

#include <stdio.h> <stdlib.h> <signal.h> <sys/types.h> <sys/stat.h> <fcntl.h> <unistd.h>

void (*mysig(int sig, void(*handler)(int))) (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)

    {

       printf("ERROR\n");

       return(SIG_ERR);

    }

    return(oldact.sa_handler);

}

void handler(int sig)

{

    const int time = 30;

printf("Now SIGINT is blocked for a some time");

sleep(time);

}

int main(void)

{

    void *oldhnd;

    oldhnd = mysig( SIGUSR1, handler);

    printf("Signal desposition has been changed\n");

    pause();

    printf("Signal desposition will be restored now\n");

    signal(SIGUSR1,handler);

    pause();

    printf("SIGACT finished...\n");

return 0;

}


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

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

int main (void)

{

    int fd [2];

    char str[256];

    char pipe_str[256];

    int err;

    if((err = pipe(fd)) < 0) ОШИБКА СОЗДАНИЯ

    if (!fork()) СЫН

    {

      printf("Entering SON function\n");

       int input = fopen("input.txt","r");

        if (input <=0) Ошибка

       else   {

printf("opened file: %s\n","input.txt");

fscanf(input,"%s",str);

           write(fd[1],str,strlen(str));

printf("wrote data to pipe\n",str);

close(input);

           close(fd[1]);

       }

       return 0;

       }

    else

    {

       printf("Entering FATHER function\n");

       read (fd[0],pipe_str,30);

       close(fd[0]);

printf("read from pipe: %s\n",pipe_str);

}

return 0;

}

8.  Именованные каналы

#include <stdio.h>, <stdlib.h>, <unistd.h>, <sys/types.h>, <sys/stat.h>, <fcntl.h>

void server(int input, int output){

    char buf[256];   int num=10;  int count=0;

    char * FileName = "input.txt";

    if (write(output,FileName,strlen(FileName))<0)

ОШИБКАЗАПИСИВ FIFO

    num = read(input,buf,256);

    if( num <0) ОШИБКА ЧТЕНИЯ

    printf("SERVER has read %d bytes\n",num);

    printf("Server has recieved data: %s\n",buf);

}

int main (void){

   int res = mknod ("output",S_IFIFO | 0666,0);

    if (res<0) ОШИБКА СОЗДАНИЯ FIFO

    res = mknod ("input",S_IFIFO | 0666,0);

    if (res<0) ОШИБКА СОЗДАНИЯ FIFO

    int output,input;

    output = open("output",O_WRONLY);

    if (output) OK else НЕОК

    sleep(1);

    input = open("input",O_RDONLY);

    if (input) ОК else НЕОК

    server(input,output);

    close(output);   close(input);

    if (unlink("input")<0) ОШИБКА

    if (unlink("output")<0) ОШИБКА

}

void client(int input, int output){

    char buf[256];   char FileName[64];

    int num = 10;    int FileID;

    num = read (input,FileName,64);

    printf("recieved file name: %s\n",FileName);

    FileID = fopen(FileName,"r");

    if (FileID<0) ОШИБКА

    int res = fscanf(FileID,"%s",buf);

    fclose(FileID);

    write(output,buf,strlen(buf));

}

int main (void){

    int input, output;

    if ((input = open("output",O_RDONLY))<0) ОШИБКА

    if ((output = open("input",O_WRONLY))<0) ОШИБКА

    client(input,output);

    close(input);    close(output);  return 0;

}

9.  Очереди сообщений

#include <stdio.h>, <stdlib.h>, <unistd.h>, <sys/types.h>, <sys/stat.h>, <fcntl.h>

int MessageNum = -1;

typedef struct{

    long type;

    char text[50];