LINUX.ORG.RU

ПОМОГИТЕ С ПРОГРАММОЙ.


0

0

ВОТ ЗАДАНИЕ. Процесс 1 открывает файл и порождает потомка 2, после этого пишет в файл N байт и посылает сигнал процессу 2. Процесс 2 пишет N байт в файл, посылает сигнал процессу 1 и завершается. Процесс 1, получив сигнал, считывает данные из файла, выводит их на экран и завершается. (ЫСЕ ДЕЛАЕТСЯ С ПОМОЩЬЮ СИС. ВЫЗОВОВ)

ВОТ КАК Я ЕЕ ПОПЫТАЛСЯ НАПИСАТЬ.НУ ЧТО ТО У МЕНЯ НЕ ТО.

#include <stdio.h> 
#include <signal.h>
#include <wait.h>
#include <sys/types.h> 
#include <fcntl.h>
#include <sys/stat.h> 
#include <unistd.h> 
#define ERR(...)    {fprintf(stderr, __VA_ARGS__); exit(1);}
int ppid,pid,i;
int f_in;
unsigned char inp, outp, pass; 
void sigper(int n){
   signal(SIGUSR1,sigper);
   printf("KOL-VO BYTE: %d\n", pass); 
   write(f_in,"1",1);
   kill(pid,SIGUSR1);
}
void sigchail(int n){
   signal(SIGUSR1,sigchail);
   write(f_in,"2",1);
   kill(ppid,SIGCHLD);
}    
int main(int argc, char*argv[]){  
   ppid=getpid(); 
   if((f_in = open(argv[1],O_RDONLY))<0) 
      ERR("Can't open %s\n", argv[1]); 
   i = atoi(argv[2]);
   pass = (unsigned char) i;
   if (pid=fork()<0){
      ERR("Can't fork");
   }else if(pid>0){
      signal(SIGUSR1,sigper);
      kill(pid,SIGUSR1);
   }else{
      pause();
      signal(SIGUSR1,sigchail);
      exit(-1);
   }
   read(1,&inp,1);
   putchar(inp);
   close(f_in);
   printf("1");
   return(0);
}  
ЗАРАНЕЕ СПАСИБО.


Вы бы хоть сказали, что происходит вместо ожидаемого поведения.

AITap ★★★★★ ()

tr [:upper:] [:lower:]

Ya_Za_Ban.2160p.BDRIP.mkv.rar.part360

anonymous ()
Ответ на: комментарий от AITap

Ничего не происходит. Программа я так подозреваю зацикливается вот этом месте.

}else{ 
      pause(); 
      signal(SIGUSR1,sigchail); 
      exit(-1);
Но почему? Вот этого я понять не могу.

zenum ()
Ответ на: комментарий от AITap

Из-за него. pause Понимаете, я его туда поставил что бы проверить отправляет ли родитель сигнал, дочернему процессу.

zenum ()
  if (fork_pid=fork()<0){ 
      ERR("Can't fork"); 
  }else if(pid>0){ 

   // FORK

   open
   write
   close

   kill (main_pid,SIGUSR1); 

   sigsuspend (SIGUSR1)

   exit (0); 

   }else{ 

      // MAIN

      sigsuspend (SIGUSR1)

      open
      seek
      write
      close

      kill ( fork_pid ,SIGUSR1); 

      exit (0); 

   } 
gamecoder ()

if (pid=fork()<0) - man приоритет операций для начала

tzukko ()
Ответ на: комментарий от tzukko

Я так понял при создание второго процесса они начинают работать случайном порядке.

zenum ()
Ответ на: комментарий от zenum

sigsuspend - ждет сигнал.

На самом деле надо ещё поставить хук на сигнал, а то главный процесс может пропустить сигнал от форка.


int i_Save_signal;
void main_watch_dog (int n)
  { 
  i_Save_signal = n;
  };


...
int main ()
...
 
  i_Save_signal = 0;

  // Включаем обработку сигнала SIGUSR1.
  signal (SIGUSR1, main_watch_dog);

  main_pid = getpid ();

  if (fork_pid=fork()<0){  

      ERR("Can't fork");  

  }else if(fork_pid>0){  
 
   // FORK 
 
   open 
   write 
   close 
 
   kill (main_pid,SIGUSR1);  
 
   sigsuspend (SIGUSR1) 
 
   exit (0);  
 
   }else{  
 
      // MAIN 

     // Проверяем, ждем сигнал от форка.
     // Сигнал мог прийти ранее этого места кода.
     // Поэтому хук ставится до создания форка.
     while ( i_Save_signal <> SIGUSR1) 
       {};

     // Отключаем обработку сигнала SIGUSR1.
     signal (SIGUSR1, SIG_DFL);


     open 
     seek 
     write 
     close 
 
     kill ( fork_pid ,SIGUSR1);  
 
     exit (0);  

   }  
gamecoder ()
Ответ на: комментарий от zenum

Чиво?
Скажи, что будет в переменной pid здесь: "(pid=fork()<0)" ?

tzukko ()
Ответ на: комментарий от gamecoder

В первом варианте, который я выложил, если сигнал от форка придет до установки sigsuspend, то программа неожиданно завершится с ошибкой.

Поэтому я и сделал хук (HOOK).

gamecoder ()
Ответ на: комментарий от tzukko

Это выражение два в одном.

Можно было по наглядней.

...

fork_pid = fork ()

if (fork_pid < 0)
  {
  ...
gamecoder ()
Ответ на: комментарий от gamecoder

Спасибо за помощь. Но хотелось бы узнать, а в чем ошибка в программе написанною мною.

zenum ()

ПОМОГИТЕ!!! СРОЧНАЯ ПРОБЛЕМА!

Я КАЖЕТСЯ ЗАЖАЛ КАПСЛОК))) И НЕ МОГУ ЕГО ОТКЛЮЧИТЬ!!

Ruga-Suneto ()

Я криво прочитал твоё задание. 8) Всё что было до этого это не правда, а надо было так :


  if (fork_pid=fork()<0){  
      ERR("Can't fork");  
  }else if(fork_pid>0){  
 
   // FORK 
 
   sigsuspend (SIGUSR1) 

   open 
   write 
   close 
 
   kill (main_pid,SIGUSR1);  
 
 
   exit (0);  
 
   }else{  
 
      // MAIN 
 
 
      open 
      seek 
      write 
      close 
 
      kill ( fork_pid ,SIGUSR1);  

      sigsuspend (SIGUSR1) 

      open 
      read
      close 
 
 
      exit (0);  
 
   }  

gamecoder ()
Ответ на: комментарий от gamecoder

>Это выражение два в одном.

Можно было по наглядней.


Нэт.
Твой вариант не равен изначальному.

tzukko ()
Ответ на: комментарий от zenum

В твоей программе форк и основной процесс сразу завершались, т.к. функция signal не ждёт завершения заданных функций. signal настраиваит какая функция запустится когда появится сигнал. Ты попутал функции.

К тому же второй else в твоей программе не нужен. Всё что после if это и есть код основной программы который будет выполняться сразу же после создания форка.

Читай маны.

gamecoder ()
Ответ на: комментарий от gamecoder

fork_pid>0 Мы находимся в родительском или дочернем процессе?

zenum ()
Ответ на: комментарий от gamecoder

вместо

 
if (fork_pid=fork()<0){  

надо было

 
fork_pid = fork () 
 
if (fork_pid < 0) 
  { 
  ... 

А то неправильно проверятся результат функции fork.

gamecoder ()
Ответ на: комментарий от gamecoder

Вооооооооооот.
Я, вообще, хотел, чтобы автор сам догадался/обмануалился.

tzukko ()
Ответ на: комментарий от tzukko

Да не соответствует, но у автора ошибка. А я показал правильное сравнение.

gamecoder ()
Ответ на: комментарий от gamecoder

Нееееее !

Посмоторел в мане.

(fork_pid > 0) надо заменить на (fork_pid == 0)

gamecoder ()
Ответ на: комментарий от gamecoder

Можно и укоротить, достаточно скобки поставить:

if ( (fork_pid=fork()) < 0 ){ 
А без скобок действительно иногда интересные результаты получаются, когда используются операции с равным приоритетом.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

>А без скобок действительно иногда интересные результаты получаются, когда используются операции с равным приоритетом.

Ога, особенно, когда приоритеты таки разные.

tzukko ()

ИЩИ ОШИБКУ, ТЕБЯ ВЫГОНЯТЬ, Я БЫ ТЕБЕ ДВОЙКУ БЕЗ ВОПРОСОВ ВЛЕПИЛ, ПОПАДИСЬ ТОЛЬКО МНЕ.

FeiWongReed ()
Ответ на: комментарий от FeiWongReed

Я только начел изучать LINUX. Я в этом деле новичок.

zenum ()
Ответ на: комментарий от zenum

Никогда больше не пиши капслоком. Никогда не пиши «ПОМОГИТЕ». В теме должно быть описание проблемы.

Ruga-Suneto ()

Чисто ради интереса: а вот эти простыни кода считаются хорошим тоном программирования на С?

ugoday ★★★★★ ()

Такое задание может возникнуть только по учёбе, а значит следует вопрос: как проходит сессия, и почему ты не учил предмет в семестре?

anonymous ()
Ответ на: комментарий от Boy_from_Jungle

> с начало изучи нормально C

Сначала изучи нормально русский.

anonymous ()
Ответ на: комментарий от tzukko

>Скажи, что будет в переменной pid здесь: "(pid=fork()<0)" ?

Я может ошибаюсь, но тут в pid будет 0 или 1.

Dudraug ★★★★★ ()
Ответ на: комментарий от zenum

Ошибка с (pid=fork()<0) - это ошибка в знание Си, а не в знание Unix.

Dudraug ★★★★★ ()
Ответ на: комментарий от anonymous

>Такое задание может возникнуть только по учёбе, а значит следует вопрос: как проходит сессия, и почему ты не учил предмет в семестре?

Да будет тебе известно, что до сессии еще месяц.

Dudraug ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.