46 lines
2.1 KiB
C
46 lines
2.1 KiB
C
/* +-----------------------------------------------+
|
|
| 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()
|
|
// indents are 3 spaces, because I find it aesthetically pleasing.
|
|
int main(int argc, char **argv) {
|
|
// First we fork, and assign the child's pid to a variable
|
|
int child = fork(); //! 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(); //! 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); //! wait(...)
|
|
printf("[PARENT]: child %d exited. Status: %d.\n", exited_child, status);
|
|
// exit
|
|
exit(EXIT_SUCCESS); //! exit(...)
|
|
}
|
|
// If we have no child, we are the child, and must execute
|
|
else {
|
|
// Get our pid, get parent's pid
|
|
int pid = getpid(), parent = getppid(); //! get[p]pid()
|
|
// Print that information
|
|
printf("[CHILD ]: pid = %d, parent_pid = %d\n", pid, parent);
|
|
/* Prepare to hand over control over to ls,
|
|
with the arguments "-la" */
|
|
char *command = "/bin/ls", *argv1 = "-la";
|
|
printf("[CHILD ]: execl(%s, %s, %s, NULL);\n", command, 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); //! execl(...)
|
|
}
|
|
}
|