Простейший IP C из одного Linux приложения в другое в C ++ на Raspberry Pi - PullRequest
1 голос
/ 11 января 2020

Мне нужен самый простой и надежный метод IP C из одного приложения C ++, работающего на RPi, в другое приложение.

Все, что я пытаюсь сделать, это отправить строковое сообщение из 40 символов из одного приложения на другое

Первое приложение работает как служба при загрузке, другое приложение запускается позднее и часто закрывается и перезапускается для отладки

Частая отладка для второго приложения что вызывает проблемы с IPC, которые я пробовал до сих пор

Я пробовал около 3 различных методов, и вот где они потерпели неудачу:

  1. Файл FIFO, проблема одна программа зависает, в то время как другая программа пишет в файл

  2. Общая память: невозможно инициализировать в одном потоке и читать из другого потока. Также частый выход во время отладки, вызывающий сбой GDB с the following GDB command is taking too long to complete -stack-list-frames --thread 1

  3. UDP-сокетом с localhost - та же проблема, что и выше, плюс неправильные выходы блокируют сокет, заставляя меня перезагрузить устройство

  4. Неблокирующая труба - нет сообщений о процессе получения

Что еще можно попробовать? Я не хочу получать библиотеку DBus, кажется слишком сложной для этого приложения.

Был бы полезен любой простой код сервера и клиента или ссылка на него

Вот мой неблокируемый код канала, который не работает для меня, я предполагаю, что его нет, потому что у меня нет ссылки к трубе из одного приложения в другое

Код, полученный здесь: https://www.geeksforgeeks.org/non-blocking-io-with-pipes-in-c/

char* msg1 = "hello"; 
char* msg2 = "bye !!"; 
int p[2], i;

bool InitClient()
{   
    // error checking for pipe 
    if(pipe(p) < 0) 
        exit(1); 

    // error checking for fcntl 
    if(fcntl(p[0], F_SETFL, O_NONBLOCK) < 0) 
        exit(2); 

    //Read
    int nread; 
    char buf[MSGSIZE]; 

    // write link 
    close(p[1]); 

    while (1) { 

        // read call if return -1 then pipe is 
        // empty because of fcntl 
        nread = read(p[0], buf, MSGSIZE); 
        switch (nread) { 
        case -1: 

            // case -1 means pipe is empty and errono 
            // set EAGAIN 
            if(errno == EAGAIN) { 
                printf("(pipe empty)\n"); 
                sleep(1); 
                break; 
            } 

        default: 

            // text read 
            // by default return no. of bytes 
            // which read call read at that time 
            printf("MSG = % s\n", buf); 
        } 
    } 

    return true;
}   

bool InitServer()
{      
    // error checking for pipe 
    if(pipe(p) < 0) 
        exit(1); 

    // error checking for fcntl 
    if(fcntl(p[0], F_SETFL, O_NONBLOCK) < 0) 
        exit(2); 


    //Write
    // read link 
    close(p[0]); 

    // write 3 times "hello" in 3 second interval 
    for(i = 0 ; i < 3000000000 ; i++) { 
        write(p[0], msg1, MSGSIZE); 
        sleep(3); 
    } 

    // write "bye" one times 
    write(p[0], msg2, MSGSIZE); 

    return true;
}       

Ответы [ 2 ]

0 голосов
/ 12 января 2020

Обратите внимание на ZeroMQ

https://zeromq.org/

Это легкий и имеет оболочку для всех основных языков программирования.

0 голосов
/ 11 января 2020

Вы можете попробовать с https://gist.github.com/miekg/a61d55a8ec6560ad6c4a2747b21e6128,

Но если информация не может быть утеряна, вам следует просмотреть подход к обмену сообщениями, такой как MQTT Protocol

Если вы планируете оставьте на том же хосте сервер и клиент, чтобы вы могли снова проверить доступ к общей памяти для производительности.

...