Важная информация
Показано с 1 по 2 из 2

Тема: Сигналы и процессы в linux C

  1. #1 Сигналы и процессы в linux C 
    Новичок
    Регистрация
    01.06.2013
    Сообщений
    1
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Здравствуйте Уважаемые программисты, необходимо было написать программу, в котором процесс 1 открывает файл и после этого порождает потомка 2, который в свою очередь порождает потомка 3. Процесс 2 пишет N байт в общий файл, посылает сигнал процессу 3, который тоже пишет N байт в файл и посылает сигнал процессу 1, который считывает данные из файла и выводит их на экран. Я написал но у меня показывает много ошибок. Помогите пожалуйста найти и исправить данные ошибки!

    Код :
    #include <iostream>
    #include <fstream>
    #include <sys/types.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <unistd.h>
    #define M 10
    #define N 5
    static struct sigaction act1;
    static struct sigaction act2;     // всякие глобальные переменные 
    static struct sigaction act3;
    int* viv=new int[M];
    int* byit=new int[M];
    char name[20]="prob.txt";  
    pid_t pid1, pid2, pid3;
    FILE* f;
     
    void func3(int signo) // обработка сигнала для третего процесса
    {
    	act3.sa_handler=func3;      // повторная "привязка"  
    	sigaction(SIGUSR1,&act3,0);
    	printf("treti'i!\n");
    	for(int i=0;i<M;i++)
      {
        byit[i]=i;    // инициализируем массив символов
        fprintf(f,"%d\n",byit[i]);       // пишим его в файл     
      }
    	kill(pid1,SIGUSR1);              // отправляем сигнал в первый процесс тем самым "разбудив" егo 
    	fclose(f);                       // закрываем файл
     
    }
    void func2(int signo) //обработка сигнала для второго процесса  
    {
       act2.sa_handler=func2;      // повторная "привязка"  
       sigaction(SIGUSR1,&act2,0);
       printf("vtoroy!\n");
       for(int i=0;i<M;i++)
      {
        byit[i]=i;    // инициализируем массив символов
        fprintf(f,"%d\n",byit[i]);       // пишим его в файл     
      } 
       kill(pid3,SIGUSR1);              // отправляем сигнал в третий процесс тем самым "разбудив" егo 
    }
      void func1(int signo)        //обработка сигнала для первого процесса
     {
       act1.sa_handler=func1;
       sigaction(SIGUSR1,&act1,0);   // повторная "привязка"
       f=fopen(name,"rb+");          //повторное открытие файла для чтения
       printf("pervyi!\n");
       for(int i=0;i<M;i++)
       {                                                                
    		fscanf(f,"%d",&viv[i]);  // считываем инфу из файла
    		printf("%d\n",viv[i]);   // выводим на экран
       }
     }
     
    int main()
    {
    	f=fopen(name,"wb+");        // создаем файл в первом процессе(которым является запущенная прога)
    	act1.sa_handler=func1;
     
    	pid2=fork();                // создаем дочерний процесс 2
        if(pid2==0)    // если его PID нулевой - то мы находимся в нем (т.е. идет второй процесс и все что написано - выполняется в нем)
    	{
    		act2.sa_handler=func2;   
    		sigaction(SIGUSR1,&act2,0);   // задаем обработку сигнала, для второго процесса
    		//   alarm(N);                     // функция которая пошлет сигнал к пробуждению процессу в котором она находится через N сек.
    		//   pause();                      // до прибытия сигнала (любого, кроме прописанного на игнор) процесс "спит"
    		pid3 = fork();				// Создаем третий дочерний процесс
    		if (pid3==0)
    		{
    			act3.sa_handler=func3;   
    			sigaction(SIGUSR1,&act3,0);   // задаем обработку сигнала, для второго процесса
    			sleep(2); // задеркжка 
    		}
    		if (pid3<0)
    		{
    			sleep(1);               // даем время добавить обработчик ("привязка")
    			printf("Cann't create process 3: error \n");
    			//wait(int *status);			//приостанавление выполнение текущего процесса
    			wait(int st);			//приостанавление выполнение текущего процесса
    			printf("Process 2: end\n");
    		}
    	}
    	return 0;
    }
    Ответить с цитированием  
     

  2. #2  
    Профи Аватар для rrrFer
    Регистрация
    01.08.2013
    Сообщений
    561
    Сказал(а) спасибо
    34
    Поблагодарили 249 раз(а) в 164 сообщениях
    Я написал но у меня показывает много ошибок. Помогите пожалуйста найти и исправить данные ошибки!
    дак че их (ошибки) искать, если "у тебя их показывает"?
    какие ошибки и где?
    [Ссылки могут видеть только зарегистрированные пользователи. ] // программирование на Prolog, Erlang, C++
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Установка FreeBasic в Linux
    от Dispetcher14 в разделе FreeBasic
    Ответов: 2
    Последнее сообщение: 05.01.2013, 14:20
  2. Системный администратор Linux
    от NIKITA.ONLINE в разделе Архив
    Ответов: 1
    Последнее сообщение: 25.04.2012, 19:29
  3. Linux в кармане
    от Gnosis в разделе Операционные системы
    Ответов: 8
    Последнее сообщение: 24.01.2012, 11:07
  4. Проблема с Linux
    от Маня в разделе Операционные системы
    Ответов: 2
    Последнее сообщение: 07.06.2011, 13:51
  5. QBasic в Linux
    от pingvin в разделе QBasic
    Ответов: 8
    Последнее сообщение: 11.03.2011, 10:13
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •