[lldb-dev] How to redirect stdin/out/err to different pty?

Piotr Rak piotr.rak at gmail.com
Sun Mar 23 07:23:38 PDT 2014


Hi,

2014-03-23 14:04 GMT+01:00 Eran Ifrah <eran.ifrah at gmail.com>:

> Thanks for your pointer Piotr. Here is the code I am using to open a
> pseudo-terminal (there is the UI part, which I left out):
>
>     char __name[128];
>     memset(__name, 0, sizeof(__name));
>
>     int master(-1);
>     m_slave = -1;
>     if(openpty(&master, &m_slave, __name, NULL, NULL) != 0)
>         return wxT("");
>
>     // disable ECHO
>     struct termios termio;
>     tcgetattr(master, &termio);
>     termio.c_lflag = ICANON;
>     termio.c_oflag = ONOCR | ONLRET;
>     tcsetattr(master, TCSANOW, &termio);
>
>     m_tty = wxString(__name, wxConvUTF8);
>
> At the end, m_tty contains a string name (e.g. /dev/pts/19 ).
> Note that the above code works flawlessly when using it with gdb (i.e. if
> I pass this "/dev/pts/19" to gdb's switch -tty=/dev/pts/19 I will get all
> the inferior output/err/input to my internal terminal)
>
> However, doing the same with LLDB (using C++ API not the command line ,
> i.e. passing "/dev/pts/19" as an argument to SBTarget::Launch(...)) I get
> nothing as output...
>
> Looks sane to me.


> Also, I am not sure I am following the idea behind replacing the "Launch"
> function with my own fork(), looking at the code of Launch() suggests that
> it does more than a simple fork...
>
>
That was my idea to debug issue if nothing else helps.
Or rather bisect on which side it really is, sorry if I did not make it
clear...
So I was trying suggest replacing SBTarget::Launch with fork,  write to
child stdout/err, and see if that works alone....

SBTarget::Launch is usually actually posix_spawn right now, it uses
posix_spawnattr_addopen to open descriptors for your specified paths, and
should open it 3 times - given current implementation - even it is just one
file.

Have you inspected SBProcess and SBError returned by SBTarget::Launch?

Do you see your inferior process is indeed launching, just not displaying
anything?

Do you have an option to check if those terminals are actually being opened
(like examining /proc/<pid>/fd for linux)?

Good luck,
/Piotr

Any more hints?
> Eran
>
>
>
> On Sat, Mar 22, 2014 at 9:36 PM, Piotr Rak <piotr.rak at gmail.com> wrote:
>
>> Hi,
>>
>> It should.
>> Have you opened master pseudoterminal like?:
>>
>>  int fd = posix_openpt(flags); // open("/dev/ptmx") might work here too
>> but less portable;
>> grantpt(fd);
>> unlockpt(fd);
>>
>> Depending on target you might need some bizarre ioctls here, but assuming
>> you are using Linux/FreeBSD/MacOSX
>> you should be fine.
>>
>> If you had already master pseudo-terminal file descriptor you can skip
>> steps above.
>>
>> You can use ptsname for master file descriptor it will return you name of
>> slave pseudo-terminal for your master.
>> Later you can pass name returned by ptsname(fd) as Launch arguments.
>>
>> If above won't work you can try replacing Launch() call with ordinary
>> fork, and in child process:
>>
>> slavefd = open(slavename, O_RDWR);
>>
>> dup2(0, slavefd);
>> dup2(1, slavefd);
>> dup2(2, slavefd);
>>
>> And see if that works alone for you...
>>
>> Good luck,
>> /Piotr
>>
>>
>> 2014-03-22 19:29 GMT+01:00 Eran Ifrah <eran.ifrah at gmail.com>:
>>
>>> Hello,
>>>
>>> I am trying to use the C++ API with good success so far.
>>> I am now at a point where I want to redirect stdin/out/err of the
>>> inferior to my application (my application creates a separate pseudo
>>> terminal window)
>>>
>>> Looking at the SBTarget::Launch, I thought that simply passing
>>> "/dev/pts/<some-number>" as the 3rd, 4th and 5th argument will do the trick
>>> .. well, it did not.
>>> I am missing something basic here, can anyone shed some light please? or
>>> give an example (better) of how to achieve this?
>>>
>>> Thanks!
>>>
>>> --
>>> Eran Ifrah
>>> Author of codelite, a cross platform open source C/C++ IDE:
>>> http://www.codelite.org
>>> wxCrafter, a wxWidgets RAD: http://wxcrafter.codelite.org
>>>
>>> _______________________________________________
>>> lldb-dev mailing list
>>> lldb-dev at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>>>
>>>
>>
>
>
> --
> Eran Ifrah
> Author of codelite, a cross platform open source C/C++ IDE:
> http://www.codelite.org
> wxCrafter, a wxWidgets RAD: http://wxcrafter.codelite.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20140323/be243fe0/attachment.html>


More information about the lldb-dev mailing list