Проблемы с forkpty

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Проблемы с forkpty

Сообщение coyot.rush » 18.02.2010 16:09:23

Итак имеем следующий код взят из DC(частично) (Linux)

Код: Выделить всё
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 Вызов осуществляеться не в потоке
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Проблемы с forkpty

Сообщение Ism » 11.09.2011 20:21:50

Привет, у меня та же задача и та же ошибка, кто нибудь знает в чем дело ?
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Проблемы с forkpty

Сообщение Ism » 13.09.2011 00:00:06

Нашел, дело в переменных окружения.
Код: Выделить всё
if (ChildPid=0) then
  begin
    //Child
    setenv('TERM', 'linux', 1);
    execlp(pchar(cmd), pchar(params), nil);   
    //если execl не сработал и новый процесс не подменил форкнутый, то ошибка
    fpWrite(C_stderr, pchar('execl() failed. Command: '+ cmd),length('execl() failed. Command: '+ cmd));
    exit;  // error exec'ing
  end else 


должно быть не execl, а execlp
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru
cron