Обмен данными между двумя независимыми процессами в C

#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 печатает только столько. Таким образом, буфер всегда очищается сервером, а затем он ожидает другого сообщения, об этом заботится ваша ОС. На всякий случай поместите все нулевые символы в буфер перед записью в него.