Аналог exec из Unix
От: vao  
Дата: 07.04.04 13:26
Оценка:
Кто-нибудь знает аналог unix вызова execv в winapi?
Так чтобы происходило замещение образа процесса.
Например в unix , было вот так

i = fork();
switch (i)
{
case -1:
perror("LOADSEGY: fork");
return(0);
case 0:
freopen(logname, "w", stdout);
freopen(errlogname, "w", stderr);
execvp(*new_argv, new_argv);
perror("LOADSEGY: execvp");
_exit(0);
default:
waitpid(i, &stat, 0)
}
В итоге создается новый процесс с id=i.
Re: Аналог exec из Unix
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.04.04 13:33
Оценка:
Здравствуйте, vao, Вы писали:

vao>Кто-нибудь знает аналог unix вызова execv в winapi?

vao>Так чтобы происходило замещение образа процесса.
vao>Например в unix , было вот так
...
vao>В итоге создается новый процесс с id=i.

Тебе нужно именно заместить или создать новый процесс ?
Форки и замещение невыполнимы, насколько мне известно.
Re[2]: Аналог exec из Unix
От: vao  
Дата: 07.04.04 13:49
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

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


vao>>Кто-нибудь знает аналог unix вызова execv в winapi?

vao>>Так чтобы происходило замещение образа процесса.
vao>>Например в unix , было вот так
PE>...
vao>>В итоге создается новый процесс с id=i.

PE>Тебе нужно именно заместить или создать новый процесс ?

PE>Форки и замещение невыполнимы, насколько мне известно.
Мне нужно замещение
Re[3]: Аналог exec из Unix
От: SergH Россия  
Дата: 07.04.04 14:10
Оценка:
Здравствуйте, vao, Вы писали:

vao>Мне нужно замещение


Документированно из user mode точно нельзя.

А зачем тебе такое?
Делай что должно, и будь что будет
Re: Аналог exec из Unix
От: ДимДимыч Украина http://klug.org.ua
Дата: 07.04.04 14:17
Оценка:
Здравствуйте, vao, Вы писали:

vao>Кто-нибудь знает аналог unix вызова execv в winapi?


CreateProcess()
в нем fork() "встроенный"

vao>Так чтобы происходило замещение образа процесса.

vao>Например в unix , было вот так

vao> i = fork();

vao> switch (i)
vao> {
vao> case -1:
vao> perror("LOADSEGY: fork");
vao> return(0);
vao> case 0:
vao> freopen(logname, "w", stdout);
vao> freopen(errlogname, "w", stderr);
vao> execvp(*new_argv, new_argv);
vao> perror("LOADSEGY: execvp");
vao> _exit(0);
vao> default:
vao> waitpid(i, &stat, 0)
vao> }
vao>В итоге создается новый процесс с id=i.

а в виндовс будет примерно так (сорри за Object Pascal, другого под рукой нет ):

var StartupInfo:TStartupInfo;
    ProcessInfo:TProcessInformation;
begin
     ZeroMemory(@StartupInfo, SizeOf(TSTartupInfo));
     StartupInfo.cb:=SizeOf(TStartupInfo);
     if CreateProcess('c:\program.exe', '/parameters', nil, nil, False, CREATE_NEW_PROCESS_GROUP, nil, nil, StartupInfo, ProcessInfo) then
     begin
          WaitForSingleObject(ProcessInfo.hThread, INFINITE);
     end else WriteLn('Error creating process: ',GetLastError);
end.


чтобы перехватить stdout и stderr смотри в сторону полей hStdOutput и hStdError в StartupInfo
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re: Аналог exec из Unix
От: Michael Chelnokov Украина  
Дата: 07.04.04 14:31
Оценка:
Здравствуйте, vao, Вы писали:

vao>Кто-нибудь знает аналог unix вызова execv в winapi?


_execv из Microsoft run-time library.
Прямого аналога в том что называют WinAPI нет.
Еще может подойти какая-нибудь реализация POSIX for Windows. Например, cygwin.
Re[3]: Аналог exec из Unix
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.04.04 14:32
Оценка:
Здравствуйте, vao, Вы писали:

PE>>Тебе нужно именно заместить или создать новый процесс ?

PE>>Форки и замещение невыполнимы, насколько мне известно.
vao>Мне нужно замещение

Просто так замещение, ради земещения, не нужно.
Что ты пишешь такое ?
Re[2]: Аналог exec из Unix
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.04.04 14:35
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Прямого аналога в том что называют WinAPI нет.

MC>Еще может подойти какая-нибудь реализация POSIX for Windows. Например, cygwin.

Там форков, насколько мне известно, нет.

Есть библиотека Uwine(от Девида Корна) , возможно в ней и реализован fork и exec, но сумлеваюсь.
Re[2]: Аналог exec из Unix
От: Michael Chelnokov Украина  
Дата: 07.04.04 14:35
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Еще может подойти какая-нибудь реализация POSIX for Windows. Например, cygwin.

... или Interix, ессно.
Re[4]: Аналог exec из Unix
От: vao  
Дата: 07.04.04 14:51
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

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


PE>>>Тебе нужно именно заместить или создать новый процесс ?

PE>>>Форки и замещение невыполнимы, насколько мне известно.
vao>>Мне нужно замещение

PE>Просто так замещение, ради земещения, не нужно.

PE> Что ты пишешь такое ?
Есть сервер он пускает новым процессом диалог выбора и настройки, при этом сервер регистрирует ProcessId. Из диалога идет запуск ресурсоемкой задачки из некоторго списка. Она замещает процесс с диалогом и общаеться с сервером. Если использовать CreateProces то задачка получаеться с новым ProcessId и сервер ее неузнаёт.
Re[2]: Аналог exec из Unix
От: Andrew S Россия http://alchemy-lab.com
Дата: 07.04.04 15:00
Оценка:
vao>>Кто-нибудь знает аналог unix вызова execv в winapi?
vao>>Так чтобы происходило замещение образа процесса.
vao>>Например в unix , было вот так
PE>...
vao>>В итоге создается новый процесс с id=i.

PE>Тебе нужно именно заместить или создать новый процесс ?

PE>Форки и замещение невыполнимы, насколько мне известно.

Пример форка с наследованием адресного пространства есть у Гарри Неббета. Ничего невыполнимого нет, просто иногда затраты на реализацию превышают эффект от реализации...
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Аналог exec из Unix
От: ДимДимыч Украина http://klug.org.ua
Дата: 08.04.04 08:54
Оценка:
Здравствуйте, vao, Вы писали:

vao>Есть сервер он пускает новым процессом диалог выбора и настройки, при этом сервер регистрирует ProcessId. Из диалога идет запуск ресурсоемкой задачки из некоторго списка. Она замещает процесс с диалогом и общаеться с сервером. Если использовать CreateProces то задачка получаеться с новым ProcessId и сервер ее неузнаёт.


каким образом задача общается с сервером? может не в идентификаторе процесса дело?
ведь в приведенном коде:


i = fork();
switch (i)

{
case -1:
perror("LOADSEGY: fork");
return(0);
case 0:
freopen(logname, "w", stdout);
freopen(errlogname, "w", stderr);
execvp(*new_argv, new_argv);
perror("LOADSEGY: execvp");
_exit(0);
default:
waitpid(i, &stat, 0)
}


execvp() вызывается из дочернего процесса, а родительский ждет его завершения.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[6]: Аналог exec из Unix
От: vao  
Дата: 08.04.04 09:06
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

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


vao>>Есть сервер он пускает новым процессом диалог выбора и настройки, при этом сервер регистрирует ProcessId. Из диалога идет запуск ресурсоемкой задачки из некоторго списка. Она замещает процесс с диалогом и общаеться с сервером. Если использовать CreateProces то задачка получаеться с новым ProcessId и сервер ее неузнаёт.


ДД>каким образом задача общается с сервером? может не в идентификаторе процесса дело?

ДД>ведь в приведенном коде:

ДД>

ДД>
ДД>i = fork();
ДД>switch (i)

ДД>{
ДД>case -1:
ДД>perror("LOADSEGY: fork");
ДД>return(0);
ДД>case 0:
ДД>freopen(logname, "w", stdout);
ДД>freopen(errlogname, "w", stderr);
ДД>execvp(*new_argv, new_argv);
ДД>perror("LOADSEGY: execvp");
ДД>_exit(0);
ДД>default:
ДД>waitpid(i, &stat, 0)
ДД>}


ДД>execvp() вызывается из дочернего процесса, а родительский ждет его завершения.


В процессе загруженном execvp() делаеться еще один execvp() зависящий от выбора пользователя.
Общаеться по очереди сообщений,одновременно может жить несколько таких процессов чтобы их различать используеться идентификатор процесса.
Re[7]: Аналог exec из Unix
От: ДимДимыч Украина http://klug.org.ua
Дата: 08.04.04 10:06
Оценка:
Здравствуйте, vao, Вы писали:

vao>В процессе загруженном execvp() делаеться еще один execvp() зависящий от выбора пользователя.

vao>Общаеться по очереди сообщений,одновременно может жить несколько таких процессов чтобы их различать используеться идентификатор процесса.

хм. тут имхо нужно:

Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.