linux下一个终端向另一个终端发送命令

linux下开了两个终端,/dev/pts/0和/dev/pts/1(具体的可以ls /dev/pts查看),linux下一切皆文件,这里我们在/dev/pts/0这个终端,向/dev/pts/1这个终端发送命令并执行,首先我们open打开文件:

open("/dev/pts/1", O_CREAT | O_RDWR, 666);

打开成功后,我们就可以发送数据了,首先会想到用write来写数据:

 write(pts_fd, "ls\n", 3);

这个时候发现ls这个命令发送到了/dev/pts/1,但是并没有执行,这里原因是仅仅使用write()函数将命令字符串写入pts通常是不够的。这是因为write()只是将数据写入文件描述符,而终端(无论是物理的还是伪的)需要特定的控制序列来识别何时开始一个新的命令、如何处理输入和输出等。
这种情况下,你有需要在/dev/pts/1上写一个程序(c、shell等)来获取发送过来得字符串,再进行转命令,这个过程又复杂又不安全。
所以选择另外一种方式,ioctl系统调用是一种用于设备I/O操作的通用接口。它允许应用程序向设备驱动程序发送控制命令,以执行特定的操作。
以下为整个代码demo.c:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdarg.h>
#include <sys/ioctl.h>

static int pts_fd = -1;
void send_cmd(char cmd)
{
        if (ioctl(pts_fd , TIOCSTI, &cmd) < 0) {
                perror("ioctl");
                exit(1);
        }
}
int main(int argc, char *argv[])
{
        int i, j;
        char c;
        pts_fd = open("/dev/pts/1", O_CREAT | O_RDWR, 666);
        for (i = 1; i < argc; i++) {
                if (i > 1) send_cmd(' ');
                for (j=0; (c = argv[i][j]); j++) {
                        send_cmd(c);
                }
        }
        send_cmd('\n');
        exit(0);
}

编译:gcc demo.c -o demo
运行:./demo ls
这时在/dev/pts/1这个终端收到ls命令并执行了该条命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值