我想用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。
您不能以这种方式执行重定向。
如果你想重定向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()