使用fork()和execl()输出redirect

我想用fork()在我的程序中产生一个新的进程。 新进程只有一个任务:将鼠标inputredirect到串口。 我已经在terminal窗口中成功testing了以下命令: hexdump / dev / input / mice> / dev / ttyS0

到目前为止,我已经设法使用fork来创buildsubprocess,但是我的问题是,我似乎无法让我的execl()方法正常工作:

execl("/usr/bin/hexdump", "hexdump", "/dev/input/mice > /dev/ttyS0", (char*) NULL); 

我也尝试过其他的变种,像这样:

 execl("/usr/bin/hexdump", "hexdump", "/dev/input/mice", ">", "/dev/ttyS0", (char*) NULL); 

但总是以相同的结果,出口值1(一般错误)。

另外值得一提的是,我已经设法通过使用popen()方法使其工作,在那里你可以完全按照你在terminal中所做的那样input命令。 popen()的问题是我没有find一个终止进程的好方法。 用fork()我得到PID,并可以通过使用以下命令终止进程:

 kill(pid, SIGKILL); 

这是一个要求,因为我必须能够在程序运行时根据需要停止并重新启动输出redirect。

Solutions Collecting From Web of "使用fork()和execl()输出redirect"

您不能以这种方式执行重定向。

如果你想重定向stdout你要执行的进程,你需要open路径,并将其复制到适当的文件描述符中。

例:

  if (!(pid = fork()) { int fd = open("/dev/ttyS0", O_WRONLY); dup2(fd, 1); // redirect stdout execl("/usr/bin/hexdump", "hexdump", "/dev/input/mice", NULL); } 

这个问题似乎是“>”的论点。 这个符号是特定于shell(bash或破折号在你的情况)。 但execl()调用不会调用shell并将参数传递给hexdump

作为一个可能的解决方案,我可以建议使用system()调用

system("hexdump /dev/input/mice > /dev/ttyS0")

这将模拟您的命令行实验的行为。

为了得到你的进程的PID,你可以继续fork() ,只需调用system()来代替execl()