C: setup pseudoterminal and open with xterm

邮差的信 提交于 2019-12-23 04:57:28

问题


The following simplified piece of code is executed by a thread in the background. The thread runs until he is told to exit (by user input).

In the code below I have removed some error checking for better readability. Even with error checking the code works well and both the master and the slave are created and/or opened.

...
int master, slave;
char *slavename;
char *cc;

master = posix_openpt(O_RDWR);

grantpt(master);
unlockpt(master);
slavename = ptsname(master);
slave = open(slavename, O_RDWR);

printf("master: %d\n",master);
printf("slavename: %s\n",slavename);

On my machine the output is the following:

master: 3
slavename: /dev/pts/4

So I thought that opening an xterm with the command xterm -S4/3 (4 = pt-slave, 3 = pt-master) while my program is running should open a new xterm window for the created pseudoterminal. But xterm just starts running without giving an error or any further informations but does not open a window at all. Any suggestions on that?

EDIT:

Now with Wumpus Q. Wumbley's help xterm starts normally, but I can't redirect any output to it. I tried:

dup2(slave, 1);
dup2(slave, 2);

printf("Some test message\n");

and opening the slave with fopen and then using fprinf. Both didn't work.


回答1:


The xterm process needs to get access to the file descriptor somehow. The intended usage of this feature is probably to launch xterm as a child process of the one that created the pty. There are other ways, though. You could use SCM_RIGHTS file descriptor passing (pretty complicated) or, if you have a Linux-style /proc filesystem try this:

xterm -S4/3 3<>/proc/$PID_OF_YOUR_OTHER_PROGRAM/fd/3

' You've probably seen shell redirection operators before: < for stdin, > for stdout, 2> for stderr (file descriptor 2). Maybe you've also seen other file descriptors being opend for input or output with things like 3<inputfile 4>outputfile. Well the 3<> operator here is another one. It opens file descriptor 3 in read/write mode. And /proc/PID/fd/NUM is a convenient way to access files opened by another process.

I don't know about the rest of the question. I haven't tried to use this mode of xterm before.

OK, the trick with /proc was a bad idea. It's equivalent to a fresh open of /dev/ptmx, creating a new unrelated pty.

You're going to have to make the xterm a child of your pty-creating program.

Here's the test program I used to explore the feature. It's sloppy but it revealed some interesting things. One interesting thing is that xterm writes its window ID to the pty master after successful initialization. This is something you'll need to deal with. It appears as a line of input on the tty before the actual user input begins.

Another interesting thing is that xterm (the version in Debian at least) crashes if you use -S/dev/pts/2/3 in spite of that being specifically mentioned in the man page as an allowed format.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(void)
{
  int master;
  char *slavename, window[64], buf[64];
  FILE *slave;

  master = posix_openpt(O_RDWR);

  grantpt(master);
  unlockpt(master);
  slavename = ptsname(master);

  printf("master: %d\n", master);
  printf("slavename: %s\n", slavename);

  snprintf(buf, sizeof buf, "-S%s/%d", strrchr(slavename,'/')+1, master);
  if(!fork()) {
    execlp("xterm", "xterm", buf, (char *)0);
    _exit(1);
  }
  slave = fopen(slavename, "r+");
  fgets(window, sizeof window, slave);
  printf("window: %s\n", window);

  fputs("say something: ", slave);
  fgets(buf, sizeof buf, slave);
  fprintf(slave, "you said %s\nexiting in 3 seconds...\n", buf);
  sleep(3);
  return 0;
}


来源:https://stackoverflow.com/questions/22200398/c-setup-pseudoterminal-and-open-with-xterm

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!