从树莓派

时间:2020-01-10 23:09:20

标签: c++ linux raspberry-pi ipc

从在RPi上运行的一个C ++应用程序到另一个应用程序,我需要最简单,最可靠的IPC方法。

我要做的就是从一个应用程序向另一个应用程序发送40个字符的字符串消息

第一个应用程序在启动时作为服务运行,另一个应用程序在以后启动,并且经常退出并重新启动以进行调试

第二个应用程序的频繁调试是什么导致到目前为止我尝试过的IPC出现问题

我尝试了3种不同的方法,但它们失败了:

  1. 文件FIFO,问题在于一个程序挂起,而另一个程序正在写入文件

  2. 共享内存:无法在一个线程上初始化并从另一线程读取。在调试时也会频繁退出,导致the following GDB command is taking too long to complete -stack-list-frames --thread 1

  3. 导致GDB崩溃
  4. 带localhost的UDP套接字-与上述相同,再加上不正确的出口阻止了套接字,迫使我重新启动设备

  5. 非阻塞管道-在接收过程中未收到任何消息

我还能尝试什么?我不想获得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 :(得分:0)

请考虑使用ZeroMQ

https://zeromq.org/

它是轻量级的,并且具有所有主要编程语言的包装器。

答案 1 :(得分:-1)

您可以尝试使用https://gist.github.com/miekg/a61d55a8ec6560ad6c4a2747b21e6128

但是如果信息不会丢失,您应该查看MQTT协议之类的消息传递方法

如果您打算将服务器和客户端留在同一主机中,则可以再次查看共享内存方法的性能。

相关问题