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命令并执行了该条命令。