曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6318|回复: 0
打印 上一主题 下一主题

[进程] ptsname() -- 获得从伪终端名

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-7-25 21:38:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ptsname() 的原型如下:
[C++] 纯文本查看 复制代码
#define _XOPEN_SOURCE       /* See feature_test_macros(7) */
       #include <stdlib.h>

       char *ptsname(int fd);

像我们从网络登录时,从 X-Windows 登录时(如 Linux 桌面的图形终端窗口) 使用的就是伪终端。顾名思义,伪终端并不是真正的硬件终端设备,而是一个应用程序。我们可以 tty 这个命令来查看当前所使用的终端名:
[beyes@beyes   process]$ tty
/dev/pts/4
后面的 4 意味着我已经打开了 4 个终端窗口,如:


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

承上面已经建立了 4 个从伪终端的情况,运行下面程序,可以“建立”第 5 个从伪终端(实际上,建立的步骤远不止于此):
[C++] 纯文本查看 复制代码
#define _XOPEN_SOURCE
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>


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


int main()
{

        int masterfd;
        char *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;
}

运行输出:
[beyes@beyes   process]$ ./ptsname
pts name : /dev/pts/5
由输出可见,我们建立了第 5 个从伪终端。

注意程序中需要有 #define _XOPEN_SOURCE 这个定义,否则在编译程序时会看到类似下面的错误:
[beyes@beyes   process]$ gcc ptsname.c -o ptsname
ptsname.c: 在函数‘main’中:
ptsname.c:24:12: 警告:赋值时将整数赋给指针,未作类型转换 [默认启用]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 03:11 , Processed in 0.067582 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表