LinuxForum.Fans
Тема

[С] fork + execl

Автор: Osanve 5 сообщений 1698 просмотров
#209152

Здравствуйте.

Ну вот и дошел я до последней ЛР по системному программному обеспечению в этом семестре.

Требуется создать окно записью в видеопамять (сделано). Реализовать поддержку мыши (сделано) и клавиатуры (сделано). Программа должна запускать из себя скомпилированные программы из предыдущих лабораторных работ (в процессе).

Когда я отлавливаю нажатие мыши или клавы, то начинает работать следующая конструкция:

text
...
case 4:
{
  if(fork() == 0)
  {
    wait(0);
  }
  else
  {
    execl("A_A", NULL);
    graph();
  }
  break;
}
...

Как и ожидалось, создается форк текущей программы, а потом на ее месте запускается другая. Управление не возвращается, но форк работает. Т.е. если я потом щелкаю мышью на том же месте, где и раньше, то внешняя программа снова вызывается, но вот до функции graph() никак не доходит, а окно перерисовать требуется, т.к. оно смещается.

Как можно решить поставленную проблему?

Заранее спасибо.

#209174

Сделал следующим образом:

text
...

int callAA() { execl("A_A", NULL); _exit(0); }

...

int my_handler(Gpm_Event *event, void *data) { void **childStack; childStack = (void **)malloc(16384); if((event->x >= 103) && (event->x <= 114)) { switch(event->y) { case 4: { clone(callAA, childStack, NULL, NULL); sleep(1); graph(); break; } ... } } return 0; }

...

Вроде работает нормально, но есть один вопрос.
Как правильно рассчитать число, которое передается функции malloc()?

#209302
Osanve написал:
Как правильно рассчитать число, которое передается функции malloc()?

по идее столько, сколько хватит потомку... вообще clone() ИРЛ вроде ни где не используется... да и для exec'а криво это выглядит и неправильно...

Первый код не работал т.к. graph() должен вызываться в предке, т.е. после wait(). После exec выполнение уже не идёт.

[added]
ещё не заметил: потомок с предком перепутаны... в общем как оно должно быть:

text

case 4:
{
  int pid;
  pid = fork();
  if(pid < 0) {
    printf("ахтунг! форк провалился\n")
  } else if(pid=0) {
    execl("A_A", NULL);
    printf("полный ахтунг! екзек провалился!\n");
  } else {
    waitpid(pid,0,0);
  }
  graph();
  break;
}
#209981
Fat-Zer написал:
в общем как оно должно быть:

Благодарю. После того, как вставил Ваш код вместо своего, нормально заработал поток клавы, который до этого зависал.

#209984
Fat-Zer написал:
printf("полный ахтунг! екзек провалился!\n");

по уму после этого ещё надо exit(100500); поставить

Войдите или зарегистрируйтесь, чтобы ответить.