     1	#include <stdio.h>
     2	#include <stdlib.h>
     3	#include <unistd.h>
     4	#include <string.h>
     5	#include <errno.h>
     6	#include <sys/types.h>
     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	}
