Кто-нибудь знает аналог 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.
Здравствуйте, vao, Вы писали:
vao>Кто-нибудь знает аналог unix вызова execv в winapi? vao>Так чтобы происходило замещение образа процесса. vao>Например в unix , было вот так
... vao>В итоге создается новый процесс с id=i.
Тебе нужно именно заместить или создать новый процесс ?
Форки и замещение невыполнимы, насколько мне известно.
Здравствуйте, Plutonia Experiment, Вы писали:
PE>Здравствуйте, vao, Вы писали:
vao>>Кто-нибудь знает аналог unix вызова execv в winapi? vao>>Так чтобы происходило замещение образа процесса. vao>>Например в unix , было вот так PE>... vao>>В итоге создается новый процесс с id=i.
PE>Тебе нужно именно заместить или создать новый процесс ? PE>Форки и замещение невыполнимы, насколько мне известно.
Мне нужно замещение
Здравствуйте, 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
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, vao, Вы писали:
vao>Кто-нибудь знает аналог unix вызова execv в winapi?
_execv из Microsoft run-time library.
Прямого аналога в том что называют WinAPI нет.
Еще может подойти какая-нибудь реализация POSIX for Windows. Например, cygwin.
Здравствуйте, vao, Вы писали:
PE>>Тебе нужно именно заместить или создать новый процесс ? PE>>Форки и замещение невыполнимы, насколько мне известно. vao>Мне нужно замещение
Просто так замещение, ради земещения, не нужно.
Что ты пишешь такое ?
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Прямого аналога в том что называют WinAPI нет. MC>Еще может подойти какая-нибудь реализация POSIX for Windows. Например, cygwin.
Там форков, насколько мне известно, нет.
Есть библиотека Uwine(от Девида Корна) , возможно в ней и реализован fork и exec, но сумлеваюсь.
Здравствуйте, Plutonia Experiment, Вы писали:
PE>Здравствуйте, vao, Вы писали:
PE>>>Тебе нужно именно заместить или создать новый процесс ? PE>>>Форки и замещение невыполнимы, насколько мне известно. vao>>Мне нужно замещение
PE>Просто так замещение, ради земещения, не нужно. PE> Что ты пишешь такое ?
Есть сервер он пускает новым процессом диалог выбора и настройки, при этом сервер регистрирует ProcessId. Из диалога идет запуск ресурсоемкой задачки из некоторго списка. Она замещает процесс с диалогом и общаеться с сервером. Если использовать CreateProces то задачка получаеться с новым ProcessId и сервер ее неузнаёт.
vao>>Кто-нибудь знает аналог unix вызова execv в winapi? vao>>Так чтобы происходило замещение образа процесса. vao>>Например в unix , было вот так PE>... vao>>В итоге создается новый процесс с id=i.
PE>Тебе нужно именно заместить или создать новый процесс ? PE>Форки и замещение невыполнимы, насколько мне известно.
Пример форка с наследованием адресного пространства есть у Гарри Неббета. Ничего невыполнимого нет, просто иногда затраты на реализацию превышают эффект от реализации...
Здравствуйте, 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() вызывается из дочернего процесса, а родительский ждет его завершения.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, vao, Вы писали:
vao>>Есть сервер он пускает новым процессом диалог выбора и настройки, при этом сервер регистрирует ProcessId. Из диалога идет запуск ресурсоемкой задачки из некоторго списка. Она замещает процесс с диалогом и общаеться с сервером. Если использовать CreateProces то задачка получаеться с новым ProcessId и сервер ее неузнаёт.
ДД>каким образом задача общается с сервером? может не в идентификаторе процесса дело? ДД>ведь в приведенном коде:
ДД>
ДД>execvp() вызывается из дочернего процесса, а родительский ждет его завершения.
В процессе загруженном execvp() делаеться еще один execvp() зависящий от выбора пользователя.
Общаеться по очереди сообщений,одновременно может жить несколько таких процессов чтобы их различать используеться идентификатор процесса.
Здравствуйте, vao, Вы писали:
vao>В процессе загруженном execvp() делаеться еще один execvp() зависящий от выбора пользователя. vao>Общаеться по очереди сообщений,одновременно может жить несколько таких процессов чтобы их различать используеться идентификатор процесса.
хм. тут имхо нужно:
или переносить ресурсоемкую задачу в dll и загружать ее из процесса диалога
или самому загружать и выполнять exe-шник (примерно как здесь