变更进程的控制终端和stdio

本文探讨了如何通过编程方式改变进程的输入、输出和错误流,将它们重定向到不同的设备节点,如/dev/tty2和/dev/tty。介绍了使用dup2()函数和setsid()函数来实现这一目标,以及如何通过ioctl()和tcsetpgrp()设置控制终端和前台进程组。示例代码展示了在不同终端窗口中打印输出的方法。
摘要由CSDN通过智能技术生成

只改stdio

tty_1 = open("/dev/tty2", O_RDONLY | O_WRONLY);
tty_2 = open("/dev/tty", O_RDONLY | O_WRONLY);
dup2(tty_1, STDIN_FILENO);0文件描述符指向/dev/tty2节点
dup2(tty_1, STDOUT_FILENO);
dup2(tty_1, STDERR_FILENO);
printf("this is printf\n");  在tty2窗口打印
write(tty_2, "this is write\n", 16);  在程序原窗口打印

只改控制终端

ret = fork();  因为父进程可能是session leader,会导致setsid()执行失败。所以,以下代码是在子进程里运行。
if (ret)
    exit(0); 父进程退出
tty_1 = open("/dev/tty2", O_RDONLY | O_WRONLY);
tty_2 = open("/dev/tty", O_RDONLY | O_WRONLY);
pid = setsid();  创建新的session,返回值是新创建session里进程的gid。其实也是进程的pid
ioctl(tty_1, TIOCSCTTY, /*force:*/ (long)1);/dev/tty2作为当前进程的控制终端
tcsetpgrp(tty_1, pid); 将当前进程作为控制终端的前台进程
printf("this is printf\n");  在程序原窗口打印
write(tty_2, "this is write\n", 16);  在tty2窗口打印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值