с реализаций B4rr4cuda я более и меннее разабоался. И даже перерхватил вывод от top 

  осталось отфильтровать вывод на предмет спец симлов  
 только нашел новые "грабли", не могу корректо завершить приложение; испытывал на top
вот код слегка переделаного эмулятора терминала
- Код: Выделить всё
 unit emlinuxterm;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}
interface
uses
 libc,sysutils;
//type
var
 Fpty:LongInt;
 id_term:LongInt;
 
function _Fork_pty_(const rows, cols: integer; const cmd:UTF8string; const params:UTF8string=''): System.THandle;
function _Read_Pty_(var str:UTF8String; timeout:timeval):longint;
function SendBreak_pty(): boolean;
function SendSignal_pty(Sig: integer): boolean;
 
{$L libutil.a} // under Linux forkpty is situated in libutil.a library 
function forkpty(__amaster:Plongint; __name:Pchar; __termp:Ptermios; __winp:Pwinsize):longint;cdecl;external clib name 'forkpty';
function setenv(__name:Pchar; __value:Pchar; __replace:longint):longint;cdecl;external clib name 'setenv';
function execl(__path:Pchar; __arg:Pchar):longint;cdecl;varargs;external clib name 'execl';
const
terminal_x=132;
terminal_y=43;
max_xy_terminal=terminal_x*terminal_y;
const
  {c_cc characters}
  CDISABLE = 255;
           //key // xterm default bindings
  CINTR    = 003; // ^C
  CQUIT    = 034; // ^
  CERASE   = 177; // ^?
  CKILL    = 025; // ^U
  CEOF     = 004; // ^D
  CSTART   = 021; // ^Q
  CSTOP    = 023; // ^S
  CSUSP    = 032; // ^Z
  CREPRINT = 022; // ^R
  CWERASE  = 027; // ^W
  CLNEXT   = 026; // ^V
  CDISCARD = 017; // ^O
  //disabled
  CTIME    = 0;
  CMIN     = 1;
  CSWTC    = CDISABLE;
  CEOL     = CDISABLE;
  CEOL2    = CDISABLE;
implementation
//uses
 //;
function _Fork_pty_(const rows, cols: integer; const cmd:UTF8string; const params:UTF8string=''): System.THandle;
var ws:TWinSize;
    ChildPid:THandle;
begin
  ws.ws_row:=rows;
  ws.ws_col:=cols;
  ws.ws_xpixel:=0;
  ws.ws_ypixel:=0;
   
  ChildPid:=forkpty(@Fpty,nil,nil,@ws);
  
  if ChildPid<0 then
  begin
    Result:=-1;
    Exit;
  end;
  if ChildPid=0 then
  begin
    //Child
    setenv('TERM', 'linux', 1);
    
    execl(pchar(cmd), pchar(params), nil);
    //execvp (PChar(Args[0]), @Args[0]);
    //если execl не сработал и новый процесс не подменил форкнутый, то ошибка
    WriteLn(pchar('execl() failed. Command: '+ cmd),length('execl() failed. Command: '+ cmd));
    //exit(127);  // error exec'ing
  end;
id_term:=ChildPid;
Result:=ChildPid;
end;
function _Read_Pty_(var str:UTF8String; timeout:timeval):longint;
var ifs:TFdSet;
    BytesRead:longint;
    buf:array [0..max_xy_terminal-1] of char;
begin
  Result:=0;
 
  if Fpty<0 then exit;
  //check if pty has new info for us
  FD_ZERO(ifs);
  FD_SET(Fpty,ifs);
  if Select(fpty+1,@ifs,nil,nil,timeout)<=0 then exit;
  bytesread := __read(fpty, buf, max_xy_terminal);
  result:=bytesread;
  str:='';
  if bytesread <= 0 then exit;
  str:=copy(buf,0,BytesRead);
end;
function SendSignal_pty(Sig: integer): boolean;
var BytesWritten:int64;
begin
  BytesWritten:=__write(Fpty,Sig,sizeof(sig));
  Result := (BytesWritten>0);
end;
function SendBreak_pty(): boolean;
begin
   result:=SendSignal_pty(CINTR);
end;
end.
Использую так
- Код: Выделить всё
 unit main;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}
interface
uses
 mseglob,mseguiglob,mseguiintf,mseapplication,msestat,msemenus,msegui,
 msegraphics,msegraphutils,mseevent,mseclasses,mseforms,msesimplewidgets,
 msewidgets,msedataedits,mseedit,msestrings,msetypes,msegraphedits,msetimer;
type
 tmainfo = class(tmainform)
   mini_term: tlabel;
   tgroupbox1: tgroupbox;
   b_run: tbutton;
   tlabel1: tlabel;
   tlabel2: tlabel;
   e_command: tstringedit;
   e_parametr: tstringedit;
   timer1: ttimer;
   b_kill: tbutton;
   l_debug: tlabel;
   tbutton1: tbutton;
   procedure read_pty(const sender: TObject);
   procedure run_sh(const sender: TObject);
   procedure kill_sh(const sender: TObject);
   procedure init_pr(const sender: TObject);
 end;
var
 mainfo: tmainfo;
implementation
uses
 main_mfm,emlinuxterm,libc,sysutils;
//таймер
procedure tmainfo.read_pty(const sender: TObject);
var
str:utf8string;
t:timeval;
begin
t.tv_sec:=0;
t.tv_usec:=10;
if _Read_Pty_(str,t)>0 then mini_term.caption:=str;
end;
//запуск
procedure tmainfo.run_sh(const sender: TObject);
begin
id_term:=_Fork_pty_(terminal_x,terminal_y,e_command.value,e_parametr.value);
b_run.enabled:=false;
timer1.enabled:=true;
b_kill.enabled:=true;
l_debug.caption:='tId'+inttostr(id_term)+' ptyId'+inttostr(Fpty);
end;
//уничтожение процесса
procedure tmainfo.kill_sh(const sender: TObject);
begin
timer1.enabled:=false;
//SendBreak_pty();
//if Fpty>0 then __close(fpty);
if id_term>0 then kill(id_term,SIGKILL);
b_kill.enabled:=false;
b_run.enabled:=true;
mini_term.caption:='_';
end;
procedure tmainfo.init_pr(const sender: TObject);
begin
b_kill.enabled:=false;
end;
end.
Нажимаю  килл (tmainfo.kill_sh) получаю зомби 
 Естественно после закрытия приложения PID освобождаеться.
Где "грабли"?
PS:
может нужно инициалтзировать теримнал функцией tcsetattr.
пробовал ,  програмаа "вылетает"
- Код: Выделить всё
 procedure initterm;
var tio:termios;
begin
 tcgetattr(Fpty,tio);
 tio.c_iflag:=BRKINT or IGNPAR or ICRNL or IXON;
 tio.c_oflag:=OPOST or ONLCR;
 tio.c_cflag:=CS8 or CREAD;
 tio.c_lflag:=ISIG or ICANON or IEXTEN or ECHO or ECHOE or ECHOK or ECHOKE or ECHOCTL;
 tio.c_cc[VINTR]:=char(CINTR);
 tio.c_cc[VQUIT]:=char(CQUIT);
 tio.c_cc[VERASE]:=char(CERASE);
 tio.c_cc[VKILL]:=char(CKILL);
 tio.c_cc[VSTART]:=char(CSTART);
 tio.c_cc[VSTOP]:=char(CSTOP);
 tio.c_cc[VSUSP]:=char(CSUSP);
 tio.c_cc[VREPRINT]:=char(CREPRINT);
 tio.c_cc[VDISCARD]:=char(CDISCARD);
 tio.c_cc[VWERASE]:=char(CWERASE);
 tio.c_cc[VLNEXT]:=char(CLNEXT);
 tio.c_cc[VEOF]:=char(CEOF);
 tio.c_cc[VEOL]:=char(CEOL);
 tio.c_cc[VEOL2]:=char(CEOL2);
 tio.c_cc[VMIN]:=char(CMIN);
 tio.c_cc[VTIME]:=char(CTIME);
 tcsetattr(Fpty,TCSANOW,tio);
end;
******
ChildPid:=forkpty(@Fpty,nil,nil,@ws);
  initterm;  
  if ChildPid<0 then
******
Добавлено спустя 3 часа 42 минуты 7 секунд:разабрался оказвыеться все просто   
 - Код: Выделить всё
 if id_term>0 then kill(id_term,SIGKILL);
waitpid(id_term,status_,WNOHANG);
b_kill.enabled:=false;
и зомби исчезают 

 
			У вас нет необходимых прав для просмотра вложений в этом сообщении.