LINUX.ORG.RU

Все это конечно хорошо, и это я давно знаю (про все 3 wait-a), но проблема в том, что программа должна в цикле рожать потомков, и при этом: если просто сделать waitpid, то тогда другие дети параллельно не запустятся: родитель будет ждать завершения работы потомка. Если же делать неблокирующий вызов wait - WNOHANG, то при моей загрузке машины (P200MMX/64Mb) этот WNOHANG-wait завершится раньше, чем потомок успеет запуститься с диска (схема fork()->exec()), и все равно будет Zombie. Так что или родитель запускает по одному процессу, или часть Zombie все равно остается. Вызов wait на уже зомбированный процесс ничего не дает, если я все правильно делал. Жду Ваших предложений.

saper ★★★★★
() автор топика

А не проще ли на потоках это все переписать?

Ogr
()

class Executor : public Fl_Brain {
public:
Executor() { proceed(); /* start */ };
private:
void action() {
rank(0); // rank==0 means lowest priority
// ;-)
#ifndef WIN32
// fork();
// execp();
// wait();
#else
#error "I'm to lazy to make threaded application ;-)"
#endif
};
};

void main()
{
const int children=1020; // Maximum! you need to
// recompile kernel to get more!

Executor e[children]; // they strts automatically (see Executor())

// Wait _all_ executors to finish their action (follow them) .
for(int i=children; i--; e[i].follow());

}

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

Убили зомби

А что мешает дождаться прихода SIGCHLD а потом сделать wait?

anonymous
()

Всем спасибо, переделал всю программу ... теперь все работает по обычному wait(NULL)

saper ★★★★★
() автор топика

waitpid нужно вставлять в обработчик SIGCHLD !!!

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