#include #include #include #include #define BUF_SIZE 10 int main(int argc, char *argv[]) { int p_fds[2]; if (pipe(p_fds) == -1) { std::cerr << "Error: pipe() - " << strerror(errno) << std::endl; exit(1); } switch (int pid = fork()) { case -1: std::cerr << "Error: fork() failed - " << strerror(errno) << std::endl; exit(1); break; case 0: // Child std::cout << "Child with PID: " << getpid() << " executing..." << std::endl; // close unwated file descriptors - write descriptor of the pipe end close(p_fds[1]); // IMPORTANT char buf[BUF_SIZE]; int n_read; std::cout << "Child with PID: " << getpid() << ", reading from parent..." << std::endl; while ((n_read = read(p_fds[0], buf, BUF_SIZE)) != 0) { if (n_read == -1) { std::cerr << "Error reading: " << strerror(errno) << std::endl; exit(1); } // Write to stdout write(STDOUT_FILENO, buf, n_read); } // Write \n to stdout write(STDOUT_FILENO, "\n", 1); std::cout << "Completed read by child with PID " << getpid() << std::endl; close(p_fds[0]); // IMPORTANT break; default: // Parent std::cout << "Parent with PID: " << getpid() << " executing..." << std::endl; // close unwated file descriptors - read descriptor of the pipe end close(p_fds[0]); // IMPORTANT // Random data char to_send[] = {"BErGgTYpK6" "KoAGxKxIdz" "y4KdQIcTx2" "YfDVUIxmQA" "t3k6ErdzfB" "kBpAX4UpBE" "qi9f45TeFZ" "WUUgONJ94I" "UKJqXYjGO2" "8qCpR4zQPl" "2M4dPnMLbd" "XEwwtYsTo3" "9g9GoJSqrz" "vdRvhPXlzU" "ZRYQ91B7lE"}; size_t to_send_len = strlen(to_send); std::cout << "Parent with PID: " << getpid() << ", writing to child..." << std::endl; int n_written = write(p_fds[1], to_send, to_send_len); if (n_written == -1) { std::cerr << "Error reading: " << strerror(errno) << std::endl; exit(1); } if (n_written != to_send_len) { std::cerr << "Incomplete write. To write: " << to_send_len << ". Actual written: " << n_written << std::endl; } // Notify write complete std::cout << "Completing write by parent with PID " << getpid() << std::endl; // close() notifies end-of-data on the fd close(p_fds[1]); // IMPORTANT break; } return 0; }