2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помогите разобраться fork - > wait
Сообщение26.11.2010, 23:10 
Аватара пользователя


24/09/09
45
Jer
Пишу программу: подобие шелла.
Есть поддержка
Код:
&
- амперсанд.
Вот с неё начинаются проблемы
Допустим при запуске такой команды:
Код:
anjuta &

нужно запустить "сына" в нём анюту.
Отцу сказать что бы не ждал окончания работы сына и быть готоывм к выполнению другой команды. При вводе новой команды, допустим
Код:
ls -l

всё происходит отлично. Напомню что ранее была открыта ANJUTA.
Перехожу в окно анюты и закрываю её.
Вот здесь начинается непонятное. прошлая команда а именно
Код:
ls -l

начинает сама по себе выполнятся до бесконечности.
Вот код функции
Код:

void cycle()
{

   char input[MAX_INPUT_LEN];
   int size=0;   
   char **vector_param = NULL;
   int multi_task = 0;
   pid_t child_pid;
   
   //   get input and delete \n symbol on the end of input
   getstring(input,MAX_INPUT_LEN);
   
   while(input != NULL)
   {
   
      if(!strcmp(input,"exit"))
         break;
      else if(!strcmp(input,""))
      {
         getstring(input,MAX_INPUT_LEN);
         continue;
      }
      
      //   check if have / remove them / set multi task true
      multi_task = mt(input);

      //   covert command line to array
      vector_param = commandArr(input,&size);
      
      //   add to array NULL on end of array
      vector_param = addTostr(vector_param,&size);      
         
      child_pid = fork();
      
      if(fork <0)
         exit(EXIT_FAILURE);
      else if(child_pid == 0)
         exec(vector_param,size);   //   do execvp with vector param
      else if(child_pid > 0)
      {
         free_arr(vector_param,size);
         
         if(!multi_task)
            wait3(&status, 0,&u_rusage);
         else
            while(wait4(child_pid,&status,WNOHANG,&u_rusage)){;}
            
         //   get input and delete \n symbol on the end of input
         getstring(input,MAX_INPUT_LEN);   
      }      
   }   

}



В какую сторону смотреть?

 Профиль  
                  
 
 Re: Помогите разобраться fork - > wait
Сообщение26.11.2010, 23:16 
Заслуженный участник


04/05/09
4593
Условие выхода из цикла неправильное - массив input не может быть равен NULL.

 Профиль  
                  
 
 Re: Помогите разобраться fork - > wait
Сообщение26.11.2010, 23:20 
Аватара пользователя


24/09/09
45
Jer
venco в сообщении #380926 писал(а):
Условие выхода из цикла неправильное - массив input не может быть равен NULL.

Ну в принципе есть такая функция
Код:
void getstring(char *input,const int max_size)
{
   if(fgets(input,max_size,stdin) != NULL)
      del_new_line(input);
   else
      input = NULL;   
}

я надеюсь что она правильно работает, к тому же сыновья всегда выполняют следующий код
Код:
void exec(char **vector_param,const int size)
{
   int exec_stat = 0;
   
   exec_stat = execvp(vector_param[0],vector_param);

   //   clean memory
   free_arr(vector_param,size);
   
   //   if execvp fail
   if(exec_stat)
      exit(EXIT_FAILURE);
   else
      exit(EXIT_SUCCESS);

}

 Профиль  
                  
 
 Re: Помогите разобраться fork - > wait
Сообщение26.11.2010, 23:39 
Заслуженный участник


04/05/09
4593
werd в сообщении #380928 писал(а):
я надеюсь что она правильно работает
Не правильно.
В случае ошибки Ваша getstring() не делает ничего, и вызывающий код об этом не узнаёт.
Вы путаете указатели и массивы, а также передачу параметров по значению и ссылке/указателю.
Проще исправить getstring(), чтобы она возвращала флаг успешности чтения строки через return, и проверять его в цикле.

 Профиль  
                  
 
 Re: Помогите разобраться fork - > wait
Сообщение26.11.2010, 23:54 
Аватара пользователя


24/09/09
45
Jer
venco в сообщении #380931 писал(а):
werd в сообщении #380928 писал(а):
я надеюсь что она правильно работает
Не правильно.
В случае ошибки Ваша getstring() не делает ничего, и вызывающий код об этом не узнаёт.
Вы путаете указатели и массивы, а также передачу параметров по значению и ссылке/указателю.
Проще исправить getstring(), чтобы она возвращала флаг успешности чтения строки через return, и проверять его в цикле.

исправил на
Код:
int getstring(char *input,const int max_size)
{
   if(fgets(input,max_size,stdin) != NULL)
   {   
      del_new_line(input);
      return(1);
   }
   else
   {
      input = NULL;
      return(0);
   }   
}

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

 Профиль  
                  
 
 Re: Помогите разобраться fork - > wait
Сообщение28.11.2010, 18:23 
Заслуженный участник


26/07/09
1559
Алматы
Ничего не понял, но все равно попробую посоветовать что-нибудь. :) Вот, например, можно попробовать заменить input=NULL; на что-нибудь вроде *input=0; или вообще удалить эту строчку. Да и потом, как у вас теперь выглядит while(input != NULL)? Может быть эта строчка тоже не нужна? Что если заменить её на while(1)? :)

 Профиль  
                  
 
 Re: Помогите разобраться fork - > wait
Сообщение28.11.2010, 19:41 
Аватара пользователя


24/09/09
45
Jer
Circiter в сообщении #381457 писал(а):
Ничего не понял, но все равно попробую посоветовать что-нибудь. :) Вот, например, можно попробовать заменить input=NULL; на что-нибудь вроде *input=0; или вообще удалить эту строчку. Да и потом, как у вас теперь выглядит while(input != NULL)? Может быть эта строчка тоже не нужна? Что если заменить её на while(1)? :)


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

То есть у меня следующей командой в первом методе было определить если инпут не равен нулю и он был равен нулю, так как сигнал выкинул с инпута.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group