From 42a79e41541b1256cf5c9005217e5703e56f392b Mon Sep 17 00:00:00 2001 From: Xi Xu Date: Mon, 28 Apr 2025 09:30:48 +0800 Subject: [PATCH] Create 4 --- 4/calculator_fifo.c | 36 ++++++++++++++++++++++ 4/collector_calculator.c | 66 ++++++++++++++++++++++++++++++++++++++++ 4/collector_fifo.c | 45 +++++++++++++++++++++++++++ 4/even_numbers.c | 33 ++++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 4/calculator_fifo.c create mode 100644 4/collector_calculator.c create mode 100644 4/collector_fifo.c create mode 100644 4/even_numbers.c diff --git a/4/calculator_fifo.c b/4/calculator_fifo.c new file mode 100644 index 0000000..42e1c8b --- /dev/null +++ b/4/calculator_fifo.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include + +#define FIFO_PATH "/tmp/collector_fifo" + +int main() { + int fd; + int num; + int sum = 0; + + printf("Calculator started. Waiting for collector...\n"); + + // Open FIFO for reading + fd = open(FIFO_PATH, O_RDONLY); + if (fd == -1) { + perror("Failed to open FIFO"); + exit(EXIT_FAILURE); + } + + printf("Connected! Ready to receive integers.\n"); + + // Read integers from the FIFO and calculate the sum + while (read(fd, &num, sizeof(int)) > 0) { + sum += num; + printf("Received: %d, Current Sum: %d\n", num, sum); + } + + close(fd); + printf("Calculator exiting.\n"); + + return 0; +} \ No newline at end of file diff --git a/4/collector_calculator.c b/4/collector_calculator.c new file mode 100644 index 0000000..8960441 --- /dev/null +++ b/4/collector_calculator.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include +#include + +int main() { + int pipe_fd[2]; + pid_t pid; + int num, sum = 0; + + // Create pipe + if (pipe(pipe_fd) == -1) { + perror("Pipe creation failed"); + exit(EXIT_FAILURE); + } + + // Create child process + pid = fork(); + + if (pid < 0) { + // Fork failed + perror("Fork failed"); + exit(EXIT_FAILURE); + } + else if (pid == 0) { + // Child process - calculator + close(pipe_fd[1]); // Close write end of pipe + + printf("[Calculator] Started. Waiting for integers...\n"); + + while (read(pipe_fd[0], &num, sizeof(int)) > 0) { + sum += num; + printf("[Calculator] Received: %d, Current Sum: %d\n", num, sum); + } + + close(pipe_fd[0]); + printf("[Calculator] Exiting.\n"); + exit(EXIT_SUCCESS); + } + else { + // Parent process - collector + close(pipe_fd[0]); // Close read end of pipe + + printf("[Collector] Started. Enter integers (Ctrl+D to exit):\n"); + + while (scanf("%d", &num) == 1) { + if (write(pipe_fd[1], &num, sizeof(int)) == -1) { + perror("Write error"); + break; + } + printf("[Collector] Sent: %d\n", num); + } + + close(pipe_fd[1]); // Close write end to signal EOF to child + printf("[Collector] Waiting for calculator to finish...\n"); + + // Wait for child to finish + wait(NULL); + + printf("[Collector] Exiting.\n"); + } + + return 0; +} \ No newline at end of file diff --git a/4/collector_fifo.c b/4/collector_fifo.c new file mode 100644 index 0000000..d0f1d68 --- /dev/null +++ b/4/collector_fifo.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define FIFO_PATH "/tmp/collector_fifo" + +int main() { + int fd; + int num; + + // Create the FIFO if it doesn't exist + if (mkfifo(FIFO_PATH, 0666) == -1 && errno != EEXIST) { + perror("mkfifo error"); + exit(EXIT_FAILURE); + } + + printf("Collector started. Connecting to calculator...\n"); + + // Open FIFO for writing + fd = open(FIFO_PATH, O_WRONLY); + if (fd == -1) { + perror("Failed to open FIFO"); + exit(EXIT_FAILURE); + } + + printf("Connected! Enter integers (Ctrl+D to exit):\n"); + + while (scanf("%d", &num) == 1) { + if (write(fd, &num, sizeof(int)) == -1) { + perror("Write error"); + break; + } + printf("Sent: %d\n", num); + } + + close(fd); + printf("Collector exiting.\n"); + + return 0; +} \ No newline at end of file diff --git a/4/even_numbers.c b/4/even_numbers.c new file mode 100644 index 0000000..af534e5 --- /dev/null +++ b/4/even_numbers.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include + +volatile int number = 0; // Current even number +volatile int direction = 1; // 1 for ascending, -1 for descending + +void handle_sigint(int sig) { + // Change direction when CTRL+C is pressed + direction = -direction; + printf("\nChanging direction to %s\n", + (direction > 0) ? "ascending" : "descending"); + // Re-register the signal handler + signal(SIGINT, handle_sigint); +} + +int main() { + // Register SIGINT handler + signal(SIGINT, handle_sigint); + + printf("Starting program: outputting even numbers\n"); + printf("Press Ctrl+C to change direction\n"); + + while (1) { + printf("%d\n", number); + number += 2 * direction; // Add or subtract 2 based on direction + fflush(stdout); // Force output to be displayed immediately + sleep(1); // Wait for 1 second + } + + return 0; +} \ No newline at end of file