0

我试图使用下一个代码将来自 arduino ( USB ) 的输出重定向到计算机上的某个文件:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

int main()
{

    pid_t pid;
    pid = fork();
    if (pid == 0) {
    execl("/bin/cat","cat /dev/cu.usbmodem1421 - 9600 >> data.txt",NULL);

    }   
    printf("Cuando desee terminar la recolección de datos presione cualquier tecla: ");

    getchar();
    kill(pid, SIGKILL);
    return 0;
}

使用 ps 验证一切是否正常,我可以看到在我的主程序后面运行的进程。停止程序后,数据文件上没有任何内容。我尝试使用 system() 这有点讨厌,因为我需要使用 OSX 终端手动终止程序。我想也许语法是错误的,我需要的只是添加另一个参数,但似乎没有任何效果。

4

2 回答 2

0

似乎您正在做fork/execl一些您可以使用简单文件 I/O 做的事情。

话虽这么说... execl 语法是,您分别传递每个参数,后跟一个空指针。所以,像这样的事情(从字面上理解你的命令......):

execl("/bin/cat", "/dev/cu.usbmodem1421", "-", "9600", ">>", "data.txt", (char *) NULL);
于 2014-02-27T19:52:44.547 回答
0

如所写,您的代码/bin/cat使用以下名称 (argv[0]) 执行:

cat /dev/cu.usbmodem1421 - 9600 >> data.txt

并且没有其他参数,因此它从其标准输入读取并写入其标准输出并坐在那里,直到它在其标准输入上检测到 EOF(或者您将其杀死)。

最简单的选项是使用system()来运行命令。

否则,您将需要将字符串拆分为单独的参数,并在子进程中处理 I/O 重定向。请注意,代码将从 3 个文件中读取:

/dev/cu.usbmodem1421
-
9600

第二个将再次被解释为标准输入。如果 9600 是为了调制解调器速度或其他东西,cat是错误的命令。

于 2014-02-27T20:16:40.603 回答