Articles of pty

套接字的function

我正在写Linux守护进程,我想实现通过telnetconfiguration其参数的能力。 我有一个cli接口代码,使用历史和完成者使用gnu readline库编写,我想使用该接口代码守护进程。 我试图将stdin / stdoutredirect到套接字,将rl_instream / rl_outstreamredirect到套接字,读/写到master / slave pty,但没有成功。 类似的问题在这里没有任何答案。 也读过这个问题 ,但我没有孩子的过程。 我的问题是: 我如何在单个进程中使用ptyfunction? 如果我只有一个进程,是否需要使用master和slave pty? 代码示例(没有对pty设备进行操作),预期结果 – readline正常工作 char* readline_buff; int main(void){ int mSock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP); int socketfd, n, flag = 1; int addrlen; daemon(1,1); setsockopt(mSock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int)); struct sockaddr_in addr; bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = […]

理解ssh2_exec()中的PTY参数

下面的答案不能令我满意,我想更多地了解发生了什么事情。 任何人都可以在ssh2_exec()函数调用中解释$ pty参数 它是否强制客户端告诉服务器产生一个PTY或是完全客户端的PTY? 据我所知,它连接到一个进程,如SSHd,例如,这将需要调用服务器。 另外,如果设置为true ,它是否会模拟默认的shell? 它是什么? 我知道你可以通过xterm例如模拟一个PTY,这是不是有什么不同? 仿真意味着从我的angular度来看这不是一个真正的PTY。 这可能有点混淆阅读,但我想抓住这个概念。 谢谢。 我很感激。

TTY和GNOMEterminal有什么区别?

像Ubuntu的操作系统,Debian的GNOMEterminal实时使用。 但是,同时ctrl + alt + f2显示terminal是一个完整的CUI。 如果在GNOMEterminal中执行tty命令,则会显示类似/ dev / pts / 3,4等的输出,但是在CUI环境中显示“/ dev / tty2”。 那么,这些terminal之间有什么区别?

Ruby杀死使用PTY.spawn打开的虚拟shell

在ruby脚本中,我启动了更多的虚拟shell,每个都由shellpipe理器对象pipe理,如下所示: @shell = PTY.spawn 'env PS1="\w>" TERM=dumb COLUMNS=63 LINES=21 sh -i' 在稍后的某个时间点,我想销毁这个实例,并杀死关联的shell进程。 可悲的是,我无法正常工作。 这是我尝试的,按照工作的概率顺序: 没有任何东西,也就是说,当pipe理对象被销毁时,期望shell proc会被closures。 使用kill命令杀死在shell上运行的所有进程(这是可行的),然后用system("kill #{@shell[2]")杀死shell本身。 这没有效果。 在上面使用-9。 这使得shell进程不存在。 当ruby程序退出时,所有的shell都会closures,但是我想在程序运行的时候杀掉它们。 任何人都遇到过这样的事情?

为什么从我的伪terminal读取失败?

我从一个进程A创build了一个伪terminal(/dev/pts/N) ,并且我正在以一定的时间间隔向这个terminal写入随机整数。 我可以从screen打开这个点,并检查它的输出。 但是cat /dev/pts/N 失败 :它无限地阻止并且不返回。 我正尝试从另一个使用open()/read()函数的进程中读取,并且read()永远不会返回。 int main(){ int source_fd = open("/dev/pts/4", O_RDONLY); while(1){ char buffer[READ_BUFFER_SIZE] = {0}; char* buff_ptr = buffer; int r = read(source_fd, (void*)buff_ptr, 1); // !!!! never comes here while(r > 0){ ++buff_ptr; r = read(source_fd, (void*)buff_ptr, 1); } } }

有没有像Python的Ruby的pty.fork?

我试图把一些像下面这样的Python代码移植到Ruby中: import pty pid, fd = pty.fork if pid == 0: # figure out what to launch cmd = get_command_based_on_user_input() # now replace the forked process with the command os.exec(cmd) else: # read and write to fd like a terminal 因为我需要像terminal一样读写subprocess,所以我知道我应该使用Ruby的PTY模块来代替Kernel.fork。 但它似乎没有一个等效的分叉方法; 我必须以string的forms传递一个命令。 这是我能得到的最接近Python的function: require 'pty' # The Ruby executable, ready to execute some codes […]

有PyRun_InteractiveLoop()从/input/输出到另一个Linux上的pty

在一个C程序中,我想运行一个Python交互式循环,它的input来自一个伪terminal(例如pts / 4),而不是从C程序启动的terminal(例如pts / 1) 。 运行交互式循环的基本方法是: PyRun_InteractiveLoop(stdin, "<stdin>"); 但是,这并不能解决问题,因为它使用了启动程序的伪terminal(pts / 1),而不是pts / 4。 有效的解决scheme是: int fd = open("/dev/pts/4", O_RDWR); dup2(fd, 0); dup2(fd, 1); dup2(fd, 2); PyRun_InteractiveLoop(stdin, "<stdin>"); 这个解决scheme的缺点是它使得文件描述符0 1 2不可用于与启动程序的伪terminal进行通信。 虽然这些描述符可能已经被重复,但是有一些函数坚持使用0 1 2,并且不能使用重复的fds。 理想情况下,我们希望交互式循环不依赖于fds 0 1 2,并且像这样在/ dev / pts / 4上运行: FILE *pts = fopen("/dev/pts/4", "rw"); PyRun_InteractiveLoop(pts, "/dev/pts/4"); 不幸的是,这并不像预期的那样工作,并且与使用stdin默认使用启动程序的伪terminal相同。 所以这个问题是双重的: 如果PyRun_InteractiveLoop()只能在stdin / fds […]

如何重用伪terminal奴隶?

我正在使用pty伪terminal模拟串行端口连接进行testing。 我打开主人: fd = open("/dev/ptmx", O_RDWR); grantpt(fd); unlockpt(fd); printf("Slave pty: %s\n", ptsname(fd)); 这工作正常,并创build一个/ dev / pts / XX从属设备。 我的testing程序打开这个设备,工作正常。 在此fd上执行select()将阻塞,直到客户端打开从属设备。 但是,当客户端closures从端时,主服务器会进入无限长0的读取循环。 如何重置从设备并返回到阻塞,直到客户端打开它,而不是反复读取0字节? 我find的唯一方法是完全closures主方,并重新打开/ grantpt / unlockpt,但我可能会得到不同的从属设备名称? 我想保持相同的从属设备..

tcgetpgrp返回0 – 含义?

语境: 我正在研究一个应用程序,需要确定进程打开的伪terminal是否是其控制terminal。 我试图使用tcgetpgrp() libc /系统调用来实现这一点。 观察: 1)我注意到tcgetpgrp()在下面的简单应用程序中为主伪terminal返回0。 我在Linux 4.10.3上运行Glibc 2.25。 int main() { int master_fd = open("/dev/ptmx", O_RDWR); grantpt(master_fd); unlockpt(master_fd); char *slave_pty = ptsname(master_fd); int slave_fd = open(slave_pty, O_RDWR); struct termios term; tcgetattr(slave_fd, &term); term.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); tcsetattr(slave_fd, TCSANOW, &term); if (fork()) { // parent close(slave_fd); while (1) { […]

X调用forkpty时抛出错误。 (C ++)

当我的程序到达这一行时: pid_t nPid = forkpty( &m_nMasterFD, NULL, NULL, NULL ); 输出这个: X Error: BadIDChoice (invalid resource ID chosen for this connection) 14 Extension: 148 (RENDER) Minor opcode: 17 (RenderCreateGlyphSet) Resource id: 0x3600002 <unknown>: Fatal IO error 4 (Interrupted system call) on X server :0.0. 并终止。 正如你所看到的,我试图让一个pty运行的东西,但它不工作。 另外,有没有办法forkpty()可以在一个类中调用? (我尝试了两种方法,但都没有奏效。) 我正在用Ubuntu 9.10编程QT C ++。 编辑: 这是一个问题与终于为我工作的代码的链接。