Мне нужен самый простой и надежный метод IP C из одного приложения C ++, работающего на RPi, в другое приложение.
Все, что я пытаюсь сделать, это отправить строковое сообщение из 40 символов из одного приложения на другое
Первое приложение работает как служба при загрузке, другое приложение запускается позднее и часто закрывается и перезапускается для отладки
Частая отладка для второго приложения что вызывает проблемы с IPC, которые я пробовал до сих пор
Я пробовал около 3 различных методов, и вот где они потерпели неудачу:
Файл FIFO, проблема одна программа зависает, в то время как другая программа пишет в файл
Общая память: невозможно инициализировать в одном потоке и читать из другого потока. Также частый выход во время отладки, вызывающий сбой GDB с the following GDB command is taking too long to complete -stack-list-frames --thread 1
UDP-сокетом с localhost - та же проблема, что и выше, плюс неправильные выходы блокируют сокет, заставляя меня перезагрузить устройство
Неблокирующая труба - нет сообщений о процессе получения
Что еще можно попробовать? Я не хочу получать библиотеку 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;
}