Автор оригинала: Duc Duy Bui.
В этом посте мы рассмотрим больше о нашем простом коде. На самом деле, сложность увеличивается. Программа изменяется на чтение/запись целого числа.
#include#include #include #include #include int main(void) { int fd[2], nbytes; pid_t childpid; int data; pipe(fd); if((childpid = fork()) == -1) { perror("fork"); exit(1); } if(childpid == 0) { close(fd[0]); data = 10; write(fd[1], &data, sizeof(int)); exit(0); } else { close(fd[1]); nbytes = read(fd[0], &data, sizeof(int)); printf("Received data: %d", data); } return(0); }
Результат: полученные данные: 10
Мы обнаружили, что труба может быть использована для передачи любых типов данных, таких как символы, INT. Вы можете перейти на Float, двойной. Следующий код использует двойной:
#include#include #include #include #include int main(void) { int fd[2], nbytes; pid_t childpid; double data; pipe(fd); if((childpid = fork()) == -1) { perror("fork"); exit(1); } if(childpid == 0) { close(fd[0]); data = 10.123; write(fd[1], &data, sizeof(double)); exit(0); } else { close(fd[1]); nbytes = read(fd[0], &data, sizeof(double)); printf("Received data: %lf", data); } return(0); }
Результат: Полученные данные: 10.123000
Почему мы берем много времени, чтобы проверить с целым числом, поплавок … Есть два целя:
- Больше времени в этом коде сделает нас более уверенно.
- Поднят один вопрос: как клиент знает, какие данные на трубе.
Смотрите код еще раз: Sizeof (Double) SizeOf (INT)
Труба не заботится о данных, передается через него. Детский процесс и родительский процесс должны определять что-то называемое протоколом. Это означает, что переговоры: «Я передаю 4 байта данных; вы получите 4 байта данных. Тогда вам нужно лечить 4 байта как целое число ».
Обычно некоторые байты в начале могут использоваться в качестве длины переданных данных.
Следующий пост: Часть 4 — Что такое труба и как это реализовано?
Спасибо за чтение!
Оригинал: «https://www.codementor.io/@duydb0181/see-code-run-understand-later-3-1ia9auqk9o»