Makefile: make file
syscalls: Solve question 2
This commit is contained in:
parent
0321ee3554
commit
b304263af0
19
Makefile
Normal file
19
Makefile
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS =
|
||||||
|
|
||||||
|
OBJECTS := syscalls.o
|
||||||
|
EXEC := syscalls
|
||||||
|
|
||||||
|
.PHONY: all clean
|
||||||
|
|
||||||
|
all: $(EXEC)
|
||||||
|
|
||||||
|
%: %.o
|
||||||
|
$(CC) $(CFLAGS) -o $@ $^
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm $(OBJECTS) $(EXEC)
|
40
syscalls.c
Normal file
40
syscalls.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/* +-----------------------------------------------+
|
||||||
|
| John Breaux - jab0910 - JohnBreaux@my.unt.edu |
|
||||||
|
| syscalls.c - CSCE4600 Homework 1 Question 2 |
|
||||||
|
+-----------------------------------------------+ */
|
||||||
|
|
||||||
|
#include <sys/wait.h> // wait()
|
||||||
|
#include <unistd.h> // fork(), getpid(), getppid(), execl(), exit()
|
||||||
|
#include <stdlib.h> // EXIT_SUCCESS
|
||||||
|
#include <stdio.h> // printf()
|
||||||
|
// tabs are 3 spaces, because I find it more aesthetically pleasing than x=[1-8]|x!=3 spaces
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
// First we fork, and assign the child's pid to a variable
|
||||||
|
int child = fork();
|
||||||
|
// If we have a child, then we're the parent, and must wait for the child to execute
|
||||||
|
if (child) {
|
||||||
|
// We get our own pid
|
||||||
|
int pid = getpid();
|
||||||
|
printf("[PARENT]: pid = %d, child = %d\n", pid, child);
|
||||||
|
// Wait for the child to exit, and acquire its status
|
||||||
|
int status = 0;
|
||||||
|
int exited_child = wait(&status);
|
||||||
|
printf("[PARENT]: child %d exited with status %d.\n", exited_child, status);
|
||||||
|
// exit
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
// If we have no child, we are the child, and are assigned the task of executing
|
||||||
|
else {
|
||||||
|
// Get our pid, get parent's pid
|
||||||
|
int pid = getpid(), parent_pid = getppid();
|
||||||
|
// Print that information
|
||||||
|
printf("[CHILD ]: pid = %d, parent_pid = %d\n", pid, parent_pid);
|
||||||
|
// Hand control over to ls, with the arguments "-la"
|
||||||
|
char *command = "/bin/ls", *argv1 = "-la";
|
||||||
|
printf("[CHILD ]: execl(%s, %s, NULL);\n", command, argv1);
|
||||||
|
// execl takes the command, the arguments, and a null-pointer terminator argument
|
||||||
|
// argv[0] is the path to the command, argv[1] is the first argument
|
||||||
|
// personally I prefer execv()/execve() for their relative ease of use
|
||||||
|
execl(command, command, argv1, (char*)NULL);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user