ptsname() -- 获得从伪终端名(slave pseudo-terminal)

伪终端并不是真正的硬件终端设备,而是一个应用程序。打开一个终端,输入tty 这个命令来查看当前所使用的终端名:

zhang@zhang-laptop:~$ tty
/dev/pts/1

后面的1意味着已经打开了1个终端窗口。实际上,像上面的 /dev/pts/1是从伪终端,它通过文件 /dev/ptmx 建立。/dev/ptmx 可以建立主从伪终端,当打开该文件时,返回的是主伪终端的文件描述符,同时也会在 /dev/pts/ 目录下建立相应的从伪终端文件,如 /dev/pts/1 , /dev/pts/2 等。更多关于主伪终端和从伪终端的信息可使用 man 4 ptmx 进行查阅。

下面这个程序可以打开两个从伪终端:

#define _XOPEN_SOURCE
#include 
#include 
#include 
#include 
#include 

// pty master
#define PTMASTER "/dev/ptmx"

int main()
{

        int amaster, aslave;
        char *slavename;
        int masterfd;

        masterfd = openpty(&amaster, &aslave, NULL, NULL, NULL);
        slavename = ptsname(amaster);
        printf("pts name : %s\n", slavename);

        masterfd = open(PTMASTER, O_RDWR);
        if (masterfd < 0) {
                perror("open");
                exit(EXIT_FAILURE);
        }
        slavename = ptsname(masterfd);
        if (slavename == NULL) {
                printf ("Get pts name failed\n");
                exit (EXIT_FAILURE);
        }
        printf ("pts name : %s\n", slavename);
        close(masterfd);

        return 0;
}

运行输出:

pts name : /dev/pts/2

pts name : /dev/pts/3

 

注意:链接时需要加上 –lutil

没有#define _XOPEN_SOURCE 这个定义,编译程序时会看到类似下面的警告:

tmp.c: In function ‘main’:
tmp.c:29: warning: implicit declaration offunction ‘ptsname’
tmp.c:29: warning: assignment makes pointerfrom integer without a cast
tmp.c:37: warning: assignment makes pointerfrom integer without a cast


改写自:http://www.groad.net/bbs/read.php?tid-7315-fpage-2.html



你可能感兴趣的:(linux)