#include #include #include #include #include #include #include void compute_subprocess(int fd) { while (true) { double number; ssize_t n = read(fd, &number, sizeof(number)); if (n <= 0) break; // EOF or error double result = std::sqrt(number); write(fd, &result, sizeof(result)); } close(fd); } int main() { std::vector tasks = {4.0, 9.0, 16.0, 25.0}; for (double number : tasks) { int fds[2]; // fds[0] <-> parent, fds[1] <-> child if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == -1) { perror("socketpair"); return 1; } pid_t pid = fork(); if (pid == -1) { perror("fork"); return 1; } else if (pid == 0) { // Child process close(fds[0]); // Close parent's end compute_subprocess(fds[1]); return 0; } else { // Parent process close(fds[1]); // Close child's end write(fds[0], &number, sizeof(number)); double result; read(fds[0], &result, sizeof(result)); std::cout << "sqrt(" << number << ") = " << result << std::endl; close(fds[0]); waitpid(pid, nullptr, 0); // Wait for child to exit } } return 0; }