fork не работает
От: yurick  
Дата: 07.05.04 11:39
Оценка:
Нужно запустить netscape из кода.
В данном конкретном случае netscape представляет из себя скрипт, который вызывает ещё один скрипт, который в свою очередь вызывает черед форк бинарь netscape-а.
В коде есть свой форк, который по всей видимости отслеживает только завершение скриптовой части (она завершается сразу после вызова бинаря), что приводит к успешной проверке на зомби дочернего процесса. В итоге netscape не запускается. Можно ли его как-нить запустить всё-таки?

Схематично в коде это выглядит так:

S_iPID = fork();
if (S_iPID == 0)
execlp("netscape", "netscape", cbFileToOpen, (char*)NULL);
else
Message("Failed to launch Netscape");
Re: fork не работает
От: Murr Россия  
Дата: 11.06.04 13:08
Оценка:
Здравствуйте, yurick, Вы писали:

Y>Нужно запустить netscape из кода.

Y>В данном конкретном случае netscape представляет из себя скрипт, который вызывает ещё один скрипт, который в свою очередь вызывает черед форк бинарь netscape-а.
Y>В коде есть свой форк, который по всей видимости отслеживает только завершение скриптовой части (она завершается сразу после вызова бинаря), что приводит к успешной проверке на зомби дочернего процесса. В итоге netscape не запускается. Можно ли его как-нить запустить всё-таки?

Y>Схематично в коде это выглядит так:


Y>S_iPID = fork();

Y>if (S_iPID == 0)
Y> execlp("netscape", "netscape", cbFileToOpen, (char*)NULL);
Y>else
Y> Message("Failed to launch Netscape");

Вы вообще в курсе, что должен возвращать fork?
Re: fork не работает
От: postmaster  
Дата: 11.06.04 13:18
Оценка:
Здравствуйте, yurick, Вы писали:

Y>Нужно запустить netscape из кода.

Y>В данном конкретном случае netscape представляет из себя скрипт, который вызывает ещё один скрипт, который в свою очередь вызывает черед форк бинарь netscape-а.
Y>В коде есть свой форк, который по всей видимости отслеживает только завершение скриптовой части (она завершается сразу после вызова бинаря), что приводит к успешной проверке на зомби дочернего процесса. В итоге netscape не запускается. Можно ли его как-нить запустить всё-таки?

Y>Схематично в коде это выглядит так:


Y>S_iPID = fork();

Y>if (S_iPID == 0)
Y> execlp("netscape", "netscape", cbFileToOpen, (char*)NULL);
Y>else
Y> Message("Failed to launch Netscape");

А должно быть так:

pid_t pid = fork();
if (pid == 0) {
    // Это потомок
    execlp("netscape", "netscape", cbFileToOpen, (char*)NULL);
    Message("Failed to launch Netscape");
} else {
    // Это родитель
    if (pid == -1) {
        // Ошибка при создании потомка
        Message("Failed to fork");
    } else {
        // Потомок успешно стартовал, ждём его завершения
        int status;
        waitpid(pid, &status, 0);
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.