- Код: Выделить всё
function pathver(cmd:utf8string):utf8string;
const
c1='/bin/';
c2='/opt/bin';
c3='/sbin/';
c4='/usr/bin/';
c5='/usr/sbin/';
c6='/usr/local/bin';
c7='/usr/local/sbin/';
begin
Result:='';
if filetouch(cmd) then Result:=cmd else
begin
if filetouch(c1+cmd) then Result:=c1+cmd else
begin
if filetouch(c2+cmd) then Result:=c2+cmd else
begin
if filetouch(c3+cmd) then Result:=c3+cmd else
begin
if filetouch(c4+cmd) then Result:=c4+cmd else
begin
if filetouch(c5+cmd) then Result:=c5+cmd else
begin
if filetouch(c6+cmd) then Result:=c6+cmd else
begin
if filetouch(c7+cmd) then Result:=c7+cmd else
begin
Result:='';
end;
end;
end;
end;
end;
end;
end;
end;
end;
function _Fork_pty_(const rows, cols: integer; const cmd:UTF8string; const params:UTF8string=''): System.THandle;
var ws:TWinSize;
ChildPid:THandle;
ArgArray:array of Pchar;
tmp_cmd:string;
begin
ws.ws_row:=rows;
ws.ws_col:=cols;
ws.ws_xpixel:=0;
ws.ws_ypixel:=0;
tmp_cmd:=pathver(cmd);
if tmp_cmd<>'' then
begin
ChildPid:=forkpty(@Fpty,nil,nil,@ws);
writeln('forkpty...');
if ChildPid<0 then
begin
writeln('forkpty...error');
Result:=-1;
Exit;
end;
if ChildPid=0 then
begin
//Child
setenv('TERM', 'linux', 1);
SetLength(argArray,3);
argArray[0]:='';
argArray[1]:='-V';
argArray[2]:=nil;
try
execve(Pchar(tmp_cmd),@argArray[0],nil);
except
writeln('error execve');
end;
end;
end;
Result:=ChildPid;
end;
Проблема в том что если tmp_cmd указывает на не исполняемый файл возникает ошибка
Signal:SIGABRT,Aborted. Function: __kernel_vsyscall
в консоле
xcb_io.c:242: process_responses: Проверочное утверждение «(((long) (dpy->last_request_read) - (long) (dpy->request)) <= 0)» не выполнено.
Аварийный останов
и приложение некоректоно завершаеться не доходя до writeln()
Тоже самое выходит если просто закоментировать
- Код: Выделить всё
try
execve(Pchar(tmp_cmd),@argArray[0],nil);
except
writeln('error execve');
end;
Версия X
- Код: Выделить всё
X -version
X.Org X Server 1.6.1.901 (1.6.2 RC 1)
Release Date: 2009-5-8
X Protocol Version 11, Revision 0
Build Operating System: Linux 2.6.18-128.1.6.el5 i686
Current Operating System: Linux localhost 2.6.29.4-167.fc11.i686.PAE #1 SMP Wed May 27 17:28:22 EDT 2009 i686
Build Date: 18 May 2009 02:47:59PM
Build ID: xorg-x11-server 1.6.1.901-1.fc11
fpc
Free Pascal Compiler version 2.4.0 [2009/12/28] for i386
PS Вызов осуществляеться не в потоке