#c #process #posix #qnx
#c #процесс #posix #qnx
Вопрос:
Как мне обмениваться данными (структурой) между двумя независимыми (без разветвления) процессами. То, что я хочу сделать, в основном что-то вроде этого:
process1:
Server(PID-399341): Waiting for input....
затем в другом терминале
process2:
Enter server process:
399341
Enter a string:
Hello
наконец
process1:
"Hello" has been entered.
Система — QNX / POSIX. Какие у меня есть варианты для этого?
Спасибо!
Комментарии:
1. TCP / IP? Или запись в файл?
2. Разделяемый сегмент памяти?
3. FIFO? Очередь сообщений? Пользовательское устройство? Вики? Другой HTTP-сервис? SneakerNet?
4. Слово, которое вы ищете, — это IPC или межпроцессное взаимодействие. qnx.com/developers/docs/6.4.1/neutrino/sys_arch/ipc.html все, что угодно из этого списка, кроме, может быть, сигналов.
5. Сокеты. Разделяемая память. IPC. Все хорошие условия для Google. xD
Ответ №1:
Это может быть легко достигнуто с помощью именованного канала (FIFO). Просто выберите имя FIFO, совпадающее с вашим PID. Вот рабочий код для сервера и клиента.
server.c
int fd;
char buf[10], rdbuf[50];
sprintf(buf,"%d",getpid());
if(mkfifo(buf,0660) == -1)
perror("mkfifo");
printf("Server(PID-%d): Waiting for input..n",getpid());
fd = open(buf,O_RDONLY);
read(fd, rdbuf, 50);
printf("%s has been enteredn",rdbuf);
close(fd);
return 0;
client.c
int fd;
char wrbuf[50], buf[10];
printf("Enter server process: ");
scanf("%s",buf);
getchar();
fd = open(buf,O_WRONLY);
printf("Enter messagen");
gets(wrbuf);
write(fd, wrbuf, strlen(wrbuf) 1);
Я думаю, что то же самое можно сделать с очередью сообщений и общим сегментом mem, сделав значение ключа таким же, как PID. Но я не уверен.
Комментарии:
1. Привет, спасибо. Всегда приятно видеть простые примеры. Итак, как сервер узнает, что буфер был изменен? Я планирую использовать это в бесконечном цикле while, когда клиент продолжает отправлять сообщения серверу.
2. Сервер всегда будет считывать 50 символов в этом примере. Если там есть нулевой символ., printf печатает только столько. Таким образом, буфер всегда очищается сервером, а затем он ожидает другого сообщения, об этом заботится ваша ОС. На всякий случай поместите все нулевые символы в буфер перед записью в него.