使用fork()和execl()输出重定向

时间:2013-12-10 07:32:40

标签: c++ linux

我想使用fork()在我的程序中生成一个新进程。新进程只有一个任务:将鼠标输入重定向到串行端口。我在终端窗口中成功测试了以下命令: hexdump / dev / input / mice>的/ dev / ttyS0来

到目前为止,我已经设法使用fork来创建子进程,但我的问题是我似乎无法使我的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()方法使其工作,您可以在其中输入与在终端中完成的命令完全相同的命令。 popen()的问题在于我没有找到终止进程的好方法。 使用fork()我得到PID,并可以使用:

终止进程
kill(pid, SIGKILL);

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

2 个答案:

答案 0 :(得分:8)

您无法以这种方式执行重定向。

如果您要为stdout的流程重定向exec,则需要open路径并将dup2添加到相应的文件描述符中。

示例:

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

答案 1 :(得分:1)

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

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

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

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

要获得流程的pid,您可以继续fork(),只需拨打system()代替execl()