1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #define BUFFER_SIZE 1<<16 8 #define ARR_SIZE 1<<16 9 10 void parse_args(char *buffer, char** args, 11 size_t args_size, size_t *nargs) 12 { 13 char *buf_args[args_size]; /* You need C99 */ 14 char **cp; 15 char *wbuf; 16 size_t i, j; 17 18 wbuf=buffer; 19 buf_args[0]=buffer; 20 args[0] =buffer; 21 22 for(cp=buf_args; (*cp=strsep(&wbuf, " \n\t")) != NULL ;){ 23 if ((*cp != '\0') && (++cp >= &buf_args[args_size])) 24 break; 25 } 26 27 for (j=i=0; buf_args[i]!=NULL; i++){ 28 if(strlen(buf_args[i])>0) 29 args[j++]=buf_args[i]; 30 } 31 32 *nargs=j; 33 args[j]=NULL; 34 } 35 36 37 int main(int argc, char *argv[], char *envp[]){ 38 char buffer[BUFFER_SIZE]; 39 char *args[ARR_SIZE]; 40 41 int *ret_status; 42 size_t nargs; 43 pid_t pid; 44 45 while(1){ 46 printf("$ "); 47 fgets(buffer, BUFFER_SIZE, stdin); 48 parse_args(buffer, args, ARR_SIZE, &nargs); 49 50 if (nargs==0) continue; 51 if (!strcmp(args[0], "exit" )) exit(0); 52 pid = fork(); 53 if (pid){ 54 printf("Waiting for child (%d)\n", pid); 55 pid = wait(ret_status); 56 printf("Child (%d) finished\n", pid); 57 } else { 58 if( execvp(args[0], args)) { 59 puts(strerror(errno)); 60 exit(127); 61 } 62 } 63 } 64 return 0; 65 }