代码中创建新终端

简介: 最常见于使用SecureCRT等工具远程创建打开终端,下面的代码演示在代码中创建打开终端: // filename: term.cpp // g++ -g -o term term.
最常见于使用SecureCRT等工具远程创建打开终端,下面的代码演示在代码中创建打开终端:

  1. // filename: term.cpp
  2. // g++ -g -o term term.cpp -lutil
  3. // login_tty()等在-lutil中
  4. #include fcntl.h>
  5. #include pty.h> // openpty and forkpty
  6. #include signal.h>
  7. #include stdio.h>
  8. #include stdlib.h>
  9. #include string.h>
  10. #include stropts.h> // ioctl
  11. #include sys/prctl.h> // prctl
  12. #include unistd.h>
  13. #include utmp.h> // login_tty

  14. static void on_signal(int signo)
  15. {
  16.     printf("[%d]signal: %s\n", getpid(), strsignal(signo));
  17. }

  18. int main()
  19. {
  20.     int amaster = 0;
  21.     char name[100];
  22.     struct termios termp; // termios.h (bits/termios.h)
  23.     struct winsize winp; // term.h(bits/ioctl-types.h)
  24.     
  25.     // forkpty的实现调用了openpty()、fork()和login_tty()
  26.     pid_t pid = forkpty(&amaster, name, &termp, &winp);
  27.     if (pid 0)
  28.     {
  29.         perror("forkpty");
  30.         exit(1);
  31.     }
  32.     else if (0 == pid)
  33.     {
  34.         // 子进程隶属于新的终端
  35.         // 子进程中的printf()在父进程隶属的终端上看不见
  36.         
  37.         // 父进程被中断或挂掉时,会向子进程发送SIGHUP
  38.         signal(SIGHUP, on_signal);
  39.         printf("child: %d\n", getpid());

  40.         while (true)
  41.         {
  42.             sleep(1);
  43.         }

  44.         exit(0);
  45.     }
  46.     else if (pid > 0)
  47.     {
  48.         // 父进程仍然使用之前的终端
  49.         // 如果中断会向了进程发送SIGHUP

  50.         printf("pid: %d/%d\n", getpid(), pid);
  51.         printf("name: %s\n", name);
  52.         printf("amaster: %d\n", amaster);
  53.         printf("win.row: %d\n", winp.ws_row);
  54.         printf("win.col: %d\n", winp.ws_col);
  55.         printf("win.xpixel: %d\n", winp.ws_xpixel);
  56.         printf("win.ypixel: %d\n", winp.ws_ypixel);
  57.         
  58.         getchar();
  59.     }

  60.     return 0;
  61. }

相关文章
|
2月前
|
存储 Shell Linux
当你打开终端并输入命令时会发生什么?(下)
当你打开终端并输入命令时会发生什么?(下)
|
Shell 网络安全 开发工具
Tabby终端工具的配置和使用
Tabby终端工具的配置和使用
6652 0
|
2月前
|
Shell
命令行基础、命令编辑技巧、常用快捷键、访问设备资源
命令行基础、命令编辑技巧、常用快捷键、访问设备资源
|
2月前
|
PHP
远程代码与命令执行
远程代码与命令执行
23 0
|
2月前
|
存储 网络协议 Unix
当你打开终端并输入命令时会发生什么?(上)
当你打开终端并输入命令时会发生什么?(上)
|
关系型数据库 API C#
C#调用执行命令行窗口cmd,及需要交互执行的处理
C#执行外部程序用到的是Process进程类,打开一个进程,可以指定进程的启动信息StartInfo(启动的程序名、输入输出是否重定向、是否显示UI界面、一些必要参数等)...
2573 0
C#调用执行命令行窗口cmd,及需要交互执行的处理
|
10月前
|
网络协议 开发工具 git
命令终端设置全局代理的两种方法
命令终端设置全局代理的两种方法
289 0
|
Ubuntu Linux Windows
项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
在Qt软件中实现部分终端控制命令行功能,使软件内可以又好的模拟终端控制,提升软件整体契合度。
项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
|
测试技术 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
809 0
 pycharm不以pytest方式运行,想要切换回普通模式运行的操作
|
Web App开发 小程序 JavaScript
从0开始创建小程序
小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。
140 0