/* +-----------------------------------------------+ | John Breaux - jab0910 - JohnBreaux@my.unt.edu | | syscalls.c - CSCE4600 Homework 1 Question 2 | +-----------------------------------------------+ */ #include // wait() #include // fork(), getpid(), getppid(), execl(), exit() #include // EXIT_SUCCESS #include // 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); } }