void processline (char *line) { pid_t cpid; int status, n_args; char **argv; // Contains the line data char newline [LINELEN]; memset(newline, 0, LINELEN); if (expand (line, newline, LINELEN) == -1) { return; } n_args = arg_parse(newline, &argv); if (n_args == 0) return; if (try_builtin(n_args, argv)) { free(argv); last_exit = 0; return; } /* Start a new process to do the job. */ cpid = fork(); if (cpid < 0) { perror ("fork"); return; } /* Check for who we are! */ if (cpid == 0) { /* We are the child! */ execvp(argv[0], argv); perror("exec"); exit (127); } free(argv); // Parent frees the malloc /* Have the parent wait for child to complete */ if (wait (&status) < 0) perror ("wait"); }
void processline (char *line) { pid_t cpid; int status, argc; char **argv; argc = arg_parse(line, &argv); /* when no arguments, do nothing */ if (argc == 0) return; /* try calling a builtin, return if successful */ if (try_builtin(argc, argv)) return; /* Start a new process to do the job. */ cpid = fork(); if (cpid < 0) { perror ("fork"); return; } /* Check for who we are! */ if (cpid == 0) { /* We are the child! */ execvp(argv[0], argv); perror ("exec"); exit (127); } /* free argv when parent */ free(argv); /* Have the parent wait for child to complete */ if (wait (&status) < 0) perror ("wait"); }