我不习惯在Linux中使用C,所以也许我在这里问一些非常简单的问题。但我有点卡住了。
我有一个来自另一家公司的程序,它在Linux终端上运行,显示一些消息,从终端(键盘)接收一些命令,并在发送命令时显示一些答案。
我创建了一个运行两个线程的C程序。一个用于从管道接收,一个用于在达到超时时发送命令。
我认为这是一种非常典型的方法,因为可以在互联网上多次找到此代码:
if (pipe(pipefd) == -1) {
perror("Error creating the pipe\n");
return 1;
} else {
pid_t pid = fork();
if (pid == 0) {
close(pipefd[0]); // Close reading descriptor
dup2(pipefd[1], STDOUT_FILENO); // Redirect output flow to the pipe
execl("../FolderApp", "App", "-n", "0", "-p", "/dev/ttyACM0", NULL); // Execute the subprocess
perror("Error executing the command\n"); // If we reach this line, there was a mistake executing the command
exit(1);
} else {
pthread_create(&reading_th, NULL, promtReceiver, NULL);
pthread_create(&sending_th, NULL, promtSender, NULL);
}
}
接收器工作起来很有魅力。我只是用途:
bytes_read = read(pipefd[0],
&internal_packet.buffer[internal_packet.buf_length],
sizeof(internal_packet.buffer) - internal_packet.buf_length - 1);
我从另一个程序里得到所有的东西。
但是,每当我尝试发送命令时,我只是得到我的命令,就好像它是由其他应用程序发送的一样。我用途:
write(pipefd[1], "command\r\n", strlen("command\r\n"));
起初我以为我收到了来自其他应用程序的回声,但没有其他响应。因为另一个应用程序显示输入命令的回显(如果可以的话),然后是响应。但是,万一我发错了命令,我一直收到回声。所以,这不是来自另一个应用程序。
我想达到的目标有可能实现吗?我应该尝试另一种方法吗?
1条答案
按热度按时间r6hnlfcb1#
如果你想在一个程序的两个示例之间共享数据,以这种方式使用管道是行不通的,因为程序的每个示例都有自己独立的内存空间。Unix管道将无法工作,因为它们是为已分叉的同一程序内的进程间通信而设计的。因此,同一个程序的两个示例使用管道将无法工作。
但是,您可以使用命名管道(也称为FIFO),这是一种可用于不相关进程之间通信的文件类型。
下面是如何使用命名管道的示例:
作者程序:
阅读器程序: