Как отправить целое число с конвейером между двумя процессами! - PullRequest
14 голосов
/ 08 марта 2011

Я пытаюсь отправить целое число с pipe в системе POSIX, но функция write() работает для отправки строковых или символьных данных.Есть ли способ отправить целое число с каналом?

С уважением

Ответы [ 4 ]

26 голосов
/ 08 марта 2011

Безопасный способ - использовать snprintf и strtol.

Но если вы знаете, что оба процесса были созданы с использованием одной и той же версии компилятора (например, это тот же исполняемый файл, который fork ed), вы можете воспользоваться тем, что все в C может быть прочитано или записано в виде массива char:

int n = something();
write(pipe_w, &n, sizeof(n));

int n;
read(pipe_r, &n, sizeof(n));
1 голос
/ 08 марта 2011

Либо отправьте строку, содержащую ASCII-представление целого числа, например, 12345679, либо отправьте четыре байта, содержащие двоичное представление типа int, например, 0x00, 0xbc, 0x61, 0x4f.

В первом случае вы будете использовать такую ​​функцию, как atoi(), чтобы вернуть целое число.

0 голосов
/ 20 февраля 2015

Ниже хорошо работает запись в трубу и чтение из трубы как:

stop_daemon =123;
res = write(cli_pipe_fd_wr, &stop_daemon, sizeof(stop_daemon));
....
res = read(pipe_fd_rd, buffer, sizeof(int));
memcpy(&stop_daemon,buffer,sizeof(int));
printf("CLI process read from res:%d status:%d\n", res, stop_daemon);

вывод:

CLI process read from res:4 status:123
0 голосов
/ 08 марта 2011

Ответ Ашельплера верен, но если это что-то, что может вырасти позже, я рекомендую вам использовать какую-то простую библиотеку протоколов, такую ​​как Протокол буферов Google , или просто JSON или XML с некоторой базовой схемой.

...