2014 dxdy logo

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

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




 
 Помогите разобраться fork - > wait
Сообщение26.11.2010, 23:10 
Аватара пользователя
Пишу программу: подобие шелла.
Есть поддержка
Код:
&
- амперсанд.
Вот с неё начинаются проблемы
Допустим при запуске такой команды:
Код:
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 
Условие выхода из цикла неправильное - массив input не может быть равен NULL.

 
 
 
 Re: Помогите разобраться fork - > wait
Сообщение26.11.2010, 23:20 
Аватара пользователя
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 
werd в сообщении #380928 писал(а):
я надеюсь что она правильно работает
Не правильно.
В случае ошибки Ваша getstring() не делает ничего, и вызывающий код об этом не узнаёт.
Вы путаете указатели и массивы, а также передачу параметров по значению и ссылке/указателю.
Проще исправить getstring(), чтобы она возвращала флаг успешности чтения строки через return, и проверять его в цикле.

 
 
 
 Re: Помогите разобраться fork - > wait
Сообщение26.11.2010, 23:54 
Аватара пользователя
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 
Ничего не понял, но все равно попробую посоветовать что-нибудь. :) Вот, например, можно попробовать заменить input=NULL; на что-нибудь вроде *input=0; или вообще удалить эту строчку. Да и потом, как у вас теперь выглядит while(input != NULL)? Может быть эта строчка тоже не нужна? Что если заменить её на while(1)? :)

 
 
 
 Re: Помогите разобраться fork - > wait
Сообщение28.11.2010, 19:41 
Аватара пользователя
Circiter в сообщении #381457 писал(а):
Ничего не понял, но все равно попробую посоветовать что-нибудь. :) Вот, например, можно попробовать заменить input=NULL; на что-нибудь вроде *input=0; или вообще удалить эту строчку. Да и потом, как у вас теперь выглядит while(input != NULL)? Может быть эта строчка тоже не нужна? Что если заменить её на while(1)? :)


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

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

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group