Создание нового процесса из нити....
От: Аноним  
Дата: 21.10.04 07:40
Оценка:
в програме крутится нить, нужно из неё запустить другую программу (предварительно убив Mutex) и текущий процесс полностью завершить(убить все нити, в общем всё что может остаться). Как это лучше всего сделать ? я запускаю через _execl, мне советуют сделать через CreateProcess() как наиболее корректно поступить в такой ситуации.

вот кусок кода
----------------------------------------

HANDLE mutex;

int
WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
/* If mutex create error — terminate */
mutex = CreateMutex(0, 1, "MyMutex");
if( !mutex || (GetLastError() == ERROR_ALREADY_EXISTS))
return 0;

_beginthread(my_thread, 0, NULL);

...

/* main loop */
while(1)
Sleep(1);


}

void
my_thread(LPVOID param)
{
int NeedRunProgram = 1;

...

If( NeedRunProgram){
/* destroy Mutex */
CloseHandle(mutex);

/* Execute program */
_execl(fname_tmp, fname_tmp, 0);

}

...
}
Re: Создание нового процесса из нити....
От: Злость Россия  
Дата: 21.10.04 07:57
Оценка:
Здравствуйте, Аноним, Вы писали:

[skip]

А> /* main loop */

А> while(1)
А> Sleep(1);

Непонятно — зачем у вас while(1) ?

Здесь долно стоять ожидание например события, а взводить его надо после вызова _execl — если все нормально прошло.
И нормально завершать программу.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[2]: Создание нового процесса из нити....
От: sae2y  
Дата: 21.10.04 08:10
Оценка:
А>> /* main loop */
А>> while(1)
А>> Sleep(1);

З>Непонятно — зачем у вас while(1) ?

ну это основной цыкл программы, там на самом деле не Sleep это я для простоты написал, чтоб было всем понятно и покороче.

З>Здесь долно стоять ожидание например события, а взводить его надо после вызова _execl — если все нормально прошло.

З>И нормально завершать программу.
Не совсем понял. Можно чуть чуть поподробнее.
Я думал что вызовом _execl() запускается новый процесс и в текущий я никогда не возвращаюсь(он завершается), однако запуск из нити немножко подпортил эту задумку.
Re[3]: Создание нового процесса из нити....
От: Злость Россия  
Дата: 21.10.04 09:24
Оценка:
Здравствуйте, sae2y, Вы писали:

[skip]

З>>Здесь долно стоять ожидание например события, а взводить его надо после вызова _execl — если все нормально прошло.

З>>И нормально завершать программу.
S>Не совсем понял. Можно чуть чуть поподробнее.
S>Я думал что вызовом _execl() запускается новый процесс и в текущий я никогда не возвращаюсь(он завершается), однако запуск из нити немножко подпортил эту задумку.

Так я был неправ в том что _execl вернется если вызов успешний.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[4]: Создание нового процесса из нити....
От: sae2y  
Дата: 21.10.04 11:24
Оценка:
Здравствуйте, Злость, Вы писали:

З>Здравствуйте, sae2y, Вы писали:


З>[skip]


З>>>Здесь долно стоять ожидание например события, а взводить его надо после вызова _execl — если все нормально прошло.

З>>>И нормально завершать программу.
S>>Не совсем понял. Можно чуть чуть поподробнее.
S>>Я думал что вызовом _execl() запускается новый процесс и в текущий я никогда не возвращаюсь(он завершается), однако запуск из нити немножко подпортил эту задумку.

З>Так я был неправ в том что _execl вернется если вызов успешний.

А вот в том то и дело что такого не происходит, приходится делать вот так
CloseHandle(mutex);
close(mainsock);
_execl(fname_tmp, fname_tmp, 0);
ExitProcess(0);

тоесть процесс почему то не завершается если я делаю _execl внутри нити.
Re[5]: Создание нового процесса из нити....
От: Злость Россия  
Дата: 21.10.04 12:44
Оценка:
Здравствуйте, sae2y, Вы писали:

[skip]

З>>Так я был неправ в том что _execl вернется если вызов успешний.

S>А вот в том то и дело что такого не происходит, приходится делать вот так
S>CloseHandle(mutex);
S>close(mainsock);
S>_execl(fname_tmp, fname_tmp, 0);
S>ExitProcess(0);

S>тоесть процесс почему то не завершается если я делаю _execl внутри нити.


вариантов может быть много

Надо смотреть как M$ реализовла данный функционал — понятное дело все в итоге приходит к CreateProcess, но что они вокруг накрутили, я незнаю.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.