+/** Buffer used to store line of characters */
+char * buffer = NULL;
+
+/** Named pipe used to communnicate with process2 */
+char * write_pipe = "/tmp/process1pipe";
+
+/** File descriptor of pipe */
+int file_descriptor;
+
+
+/**
+ * Shared memory variables
+ */
+/**
+ * Memory key for processes. Must be same between all processes to properly
+ * communicate.
+ */
+key_t shmkey = 18912;
+/**
+ * Id of the shared memory
+ */
+int shmid;
+
+/**
+ * Message shared by processes. Contains array of process IDs
+ */
+struct message {
+ pid_t pids[3];
+};
+
+struct message * processes = NULL;
+
+/**
+ * Handler for signals.
+ */
+void sig_handler(int signo)
+{
+ fprintf(stderr, "[%s] Received %s!\n", "process1", strsignal(signo));
+ if (signo == SIGUSR1) {
+ }
+ else if (signo == SIGTERM) {
+ int i = 0;
+ fprintf(stderr, "[%s] > Releasing resources\n", "process1");
+ close(write_pipe);
+ unlink(write_pipe);
+
+ if (buffer) {
+ free(buffer);
+ buffer = NULL;
+ }
+ for (; i < 3; i++) {
+ fprintf(stderr, "[%s] Process %d, PID: %d\n", "process3", i, processes->pids[i]);
+ }
+ exit(0);
+ }
+ else if (signo == SIGTSTP) {
+ fprintf(stderr, "[%s] > Closing pipe\n", "process1");
+ close(write_pipe);
+ raise (SIGSTOP);
+ }
+ else if (signo == SIGCONT) {
+ fprintf(stderr, "[%s] > Opening pipe\n", "process1");
+ file_descriptor = open(write_pipe, O_WRONLY);
+ }
+}
+