gpt4 book ai didi

linux - 无法写入伪终端主机

转载 作者:太空宇宙 更新时间:2023-11-04 12:42:23 25 4
gpt4 key购买 nike

我可以打开一个新的伪终端,并在从站上启动一个 shell,但是写入主站似乎没有做任何事情,并且在 shell 启动后尝试读取以失败告终(-1 ).我做错了什么:

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <sys/ioctl.h>

int posix_openpt(int flags);
int grantpt(int fd);
int unlockpt(int fd);
char *ptsname(int fd);


static void execsh(void);



int main(int argc, char *argv[]) {
printf("Hiya\n");

// Open the Master Clone Device /dev/ptmx, return the fd
int master_fd = posix_openpt(O_RDWR);
printf("PTMaster = %d\n", master_fd);

// Change the permissions and ownership of the slave device
int grant_success = grantpt(master_fd);
printf("Grant success = %d\n", grant_success);

// Unlock the slave pseudoterminal device corresponding to master_fd
int unlock_success = unlockpt(master_fd);
printf("Unlock success = %d\n", unlock_success);

// Grab the name of the slave device
char *slave_name = ptsname(master_fd);
printf("Slave name = %s\n", slave_name);


// Open the slave pseudoterminal device
int slave_fd = open(slave_name, O_WRONLY);
printf("Slave fd = %d\n", slave_fd);

// Exec shell
pid_t pid;
switch (pid = fork()) {
case -1:
printf("Failed to fork\n");
break;
case 0:
// Child
setsid(); /* create a new process group */
dup2(slave_fd, STDIN_FILENO);
dup2(slave_fd, STDOUT_FILENO);
dup2(slave_fd, STDERR_FILENO);
ioctl(slave_fd, TIOCSCTTY, NULL); /* make this the controlling terminal for this process */
close(slave_fd);
close(master_fd);


// Start Shell
execsh();
break;
default:
// Parent
close(slave_fd);
}


// Read from master
sleep(1);
char buffer[200];
ssize_t read_bytes = read(master_fd, buffer, 200);
printf("read %ld from master\n", read_bytes);
printf("buffer = %s\n", buffer);

// ls
ssize_t written = write(master_fd, "ls\n", 3);
printf("wrote %ld to master\n", written);


// Read from master
read_bytes = read(master_fd, buffer, 200);
printf("read %ld from master\n", read_bytes);
printf("buffer = %s\n", buffer);


close(master_fd);
kill(pid, SIGKILL); // Kill the child, biblical

return 0;
}


void
execsh(void) {
char **args;
char *envshell = getenv("SHELL");

unsetenv("COLUMNS");
unsetenv("LINES");
unsetenv("TERMCAP");


signal(SIGCHLD, SIG_DFL);
signal(SIGHUP, SIG_DFL);
signal(SIGINT, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
signal(SIGALRM, SIG_DFL);

args = (char *[]){envshell, "-i", NULL};
printf("\nforked child starting terminal\n");
execvp(args[0], args);
printf("\nExited the shell\n");
exit(EXIT_FAILURE);
}

输出看起来像这样:

Hiya
PTMaster = 3
Grant success = 0
Unlock success = 0
Slave name = /dev/pts/19
Slave fd = 4
read 130 from master
buffer =
forked child starting terminal
eric@vbox:~/Desktop/terminal$ exit

wrote 3 to master
read -1 from master
buffer =
forked child starting terminal
eric@vbox:~/Desktop/terminal$ exit

我也不确定为什么它有退出这个词。提前感谢您的任何指点!

最佳答案

ninjalj 是对的。我打开了 slave 只用于写入。

非常感谢!

关于linux - 无法写入伪终端主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39775361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com