aboutsummaryrefslogtreecommitdiffstats
path: root/csci4061/101920_breakout
diff options
context:
space:
mode:
Diffstat (limited to 'csci4061/101920_breakout')
-rw-r--r--csci4061/101920_breakout/pipe_template.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/csci4061/101920_breakout/pipe_template.c b/csci4061/101920_breakout/pipe_template.c
new file mode 100644
index 0000000..2c37941
--- /dev/null
+++ b/csci4061/101920_breakout/pipe_template.c
@@ -0,0 +1,65 @@
+// -----------------------------------------------------------------------------
+// Pipes
+//
+// Write a program that creates a child process and pipes the string
+// "hello child" to the child to be printed. The parent should wait for the
+// child to terminate
+//
+// Template: Implement the TODOs
+//
+// Expected output:
+// Parent Sending: hello child
+// Child Received: hello child
+// -----------------------------------------------------------------------------
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+int main(void) {
+ // Open pipe
+ int ends[2];
+ pipe(ends);
+
+ char string_to_send[] = "hello child";
+ int bytes_to_send_recv = strlen(string_to_send) + 1;
+
+ // Create child process
+ pid_t pid = fork();
+ if (pid < 0) {
+ // Error
+ fprintf(stderr, "ERROR: Failed to fork\n");
+ }
+ else if (pid > 0) {
+ // Parent
+ printf("Parent Sending: %s\n", string_to_send);
+
+ // Parent doesn't need read file descriptor
+ close(ends[0]);
+ // Write the string to the pipe
+ write(ends[1], string_to_send, bytes_to_send_recv);
+ // Done writing
+ close(ends[1]);
+ // Wait for child to terminate
+ wait(NULL);
+ }
+ else {
+ // Child
+
+ char *recv_buffer = malloc(bytes_to_send_recv);
+
+ // Child doesn't need write file descriptor
+ close(ends[1]);
+ // Read the string from the pipe
+ read(ends[0], recv_buffer, bytes_to_send_recv);
+ // Done reading
+ close(ends[0]);
+ // Print result
+ printf("Child Received: %s\n", recv_buffer);
+ free(recv_buffer);
+ }
+
+ return 0;
+}