使用管道将数据发送到C中的另一个程序

snz8szmq  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(159)

我不习惯在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"));

起初我以为我收到了来自其他应用程序的回声,但没有其他响应。因为另一个应用程序显示输入命令的回显(如果可以的话),然后是响应。但是,万一我发错了命令,我一直收到回声。所以,这不是来自另一个应用程序。
我想达到的目标有可能实现吗?我应该尝试另一种方法吗?

r6hnlfcb

r6hnlfcb1#

如果你想在一个程序的两个示例之间共享数据,以这种方式使用管道是行不通的,因为程序的每个示例都有自己独立的内存空间。Unix管道将无法工作,因为它们是为已分叉的同一程序内的进程间通信而设计的。因此,同一个程序的两个示例使用管道将无法工作。
但是,您可以使用命名管道(也称为FIFO),这是一种可用于不相关进程之间通信的文件类型。
下面是如何使用命名管道的示例:
作者程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    int fd;
    char * myfifo = "/tmp/myfifo";

    // create the FIFO (named pipe)
    mkfifo(myfifo, 0666);

    char arr1[80];
    while (1)
    {
        fd = open(myfifo, O_WRONLY);
        fgets(arr1, 80, stdin);
        write(fd, arr1, strlen(arr1)+1);
        close(fd);
    }
    return 0;
}

阅读器程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    int fd1;

    // FIFO file path
    char * myfifo = "/tmp/myfifo";

    // creating the named pipe (FIFO)
    mkfifo(myfifo, 0666);

    char str1[80];
    while (1)
    {
        // first open in read only and read
        fd1 = open(myfifo,O_RDONLY);
        read(fd1, str1, 80);

        // print the read string and close
        printf("User1: %s\n", str1);
        close(fd1);
    }
    return 0;
}

相关问题