#include #include #include #include int main(int argc, char ** argv) { int childstat; char ** lsargv; char ** lsenv; printf("Entry\n"); pid_t pidreturn = fork(); if (pidreturn == 0) { printf("hello from child\n"); if (argc > 1) { // Exec /bin/ls -l .. // allocate and initialize argv needed for execve lsargv = (char **) malloc(4 * sizeof(char *)); lsargv[0] = "/bin/ls"; lsargv[1] = "-l"; lsargv[2] = ".."; lsargv[3] = NULL; //allocate and initialize env needed for execve lsenv = (char **) malloc(1 * sizeof(char *)); lsenv[0] = NULL; execve(lsargv[0], lsargv, lsenv); } else { sleep(10); } } else { printf("hello from parent. Child's pid is %d\n", pidreturn); waitpid(pidreturn, &childstat, 0); assert(WIFEXITED(childstat)); printf("Child exit status: %d\n", WEXITSTATUS(childstat)); } // on execve case, child should never get here printf("After conditional\n"); if (pidreturn == 0) { return 1; } else { return 5; } }