Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Как клонировать процесс?


Автор: Pakshin A. S. 6.11.2004, 18:48
Код

{  
  In Linux it is possible to duplicate a process with fork. In the original  
  process, fork will return the handle to the duplicated process. The  
  duplicated process will return zero.  
}  

program TestFork;  

{$APPTYPE CONSOLE}  

uses  
  SysUtils,  
  Libc;  

var  
  ForkedProcessHandle: __pid_t;  
  bForked: Boolean;  

procedure ForkNow;  
begin  
  bForked := true;  
  ForkedProcessHandle := fork;  
end;  

function IsForked: Boolean;  
begin  
  Result := (ForkedProcessHandle = 0) and bForked;  
end;  

var  
  Lf: Integer;  

begin  
  sigignore(SIGCHLD);  
  bForked := false;  

  WriteLn('do some stuff');  

  WriteLn('before fork');  
  ForkNow;  
  WriteLn('after fork - we have dublicated the process');  

  if IsForked then begin  
    WriteLn('do some stuff in forked process (wait 5s)');  
    for Lf := 0 to 50 do begin  
      Write('f');  
      sleep(100);  
    end;  
  end else begin  
    WriteLn('do stuff in original process (wait 10)');  
    for Lf := 0 to 100 do begin  
      Write('o');  
      sleep(100);  
    end;  
  end;  

  WriteLn;  

  if IsForked then  
    WriteLn('forked process end')  
  else  
    WriteLn('original process end');  
end.  


{  
Output of this demo app:  

do some stuff  
before fork  
after fork - we have dublicated the process  
after fork - we have dublicated the process  
do some stuff in forked process (wait 5s)  
fdo stuff in original process (wait 10)  
ooffooffooffooffooffooffooffooffooffooffooffooffooffooffooffooffooffooff  
ooffooffooffooffooffooffooffoo  
forked process end  
ooooooooooooooooooooooooooooooooooooooooooooooooo  
original process end  
}  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)