2014-09-25 52 views
0

所有,我運行程序和下面處接收的問題的端部的輸出。我不確定這是否是我對execl理解上的差距,或者如果我在這裏完全錯誤地做了某些事情。該代碼是相當直接的,並且參數/輸出被說明如下:叉()&EXECL - 無法運行外部過程

編輯:固定的sizeof(ARG),以反映arg的實際尺寸;不過,因爲你可以看到它返回一個令人費解的「1」,但它應該是大小的2

int shell (int argc, char *argv[]) { 
    char *s;   /* user input string */ 
    tok_t *t;   /* tokens parsed from input */ 
    int lineNum = 0; 
    int fundex = -1; 
    pid_t pid = getpid();  /* get current processes PID */ 
    pid_t ppid = getppid(); /* get parents PID */ 

    printf("%s running as PID %d under %d\n",argv[0],pid,ppid); 
    lineNum=0; 
    fprintf(stdout,"%d: ",lineNum); 
    while ((s = freadln(stdin))) { 
    t = getToks(s);  /* Break the line into tokens */ 
    fundex = lookup(t[0]); /* Is first token a shell literal */ 
    if (fundex >= 0) cmd_table[fundex].fun(&t[1]); 
    else {   /* Treat it as a file to exec */ 
     cmd_fork(t); 
    } 
    fprintf(stdout,"%d: ",++lineNum); 
    } 
    return 0; 
} 

int cmd_fork(tok_t arg[]) { 
    size_t size = 120; 
    int i, status = 0; 
    pid_t childPid; 
    char *nargs = (char *) malloc(size); 

    printf("sizeof arg: %lu\n", (sizeof(arg)/sizeof(tok_t))); // returns 1? 
    if ((sizeof(arg)/sizeof(tok_t)) >= 2) { 
    printf("arg0: %s, arg1: %s\n", arg[0], arg[1]); 
    if (sizeof(arg) > 2) { 
     for (i=1; i < sizeof(arg); i++) { 
     if (i > 1) { 
      strcat(nargs, " "); 
     } 
     strcat(nargs, arg[i]); 
     printf("Nargs: %s\n", nargs); 
     } 
    } 
    execl(arg[0], arg[0], nargs, NULL); 
    _exit(127); 
    } 

    if (childPid > 0) { 
    waitpid(childPid, &status, 0);  
    printf("Exit status of process was %d\n", status); 
    } else { 

    printf("Child failed"); 
    } 

    return 0; 
} 

輸出:

./shell running as PID 3595 under 1833 
0: /usr/bin/wc /home/vagrant/example 
T0: /usr/bin/wc, T1: /home/vagrant/example 
arg0: /usr/bin/wc, arg1: /home/vagrant/example 
sizeof arg: 1 
/usr/bin/wc: invalid zero-length file name 
Exit status of process was 256 

我不太清楚發生了什麼事情不對,但會非常感謝任何正確方向的指針。

謝謝

+2

'sizeof(arg)'不會給你在該數組中的「元素數量」。 – 5gon12eder 2014-09-25 23:13:53

+0

大有趕超@ 5gon12eder它一直以來,我寫任何C.更新了一個令人費解的結果,而:'的sizeof(阿根廷)/的sizeof(ARG [0])'返回1;因此,'的sizeof(ARG)/的sizeof(tok_t)'也爲1。但是,陣列的大小爲兩個,這兩個條目是'tok_t'。我添加主)代碼(/它是如何現在叫... – Momer 2014-09-25 23:41:18

+1

'的sizeof(阿根廷)/的sizeof(ARG [0])'是錯誤的,太。儘管被聲明爲使用數組語法,但是'arg'是這裏的一個*指針*和'sizeof(arg)== sizeof(tok_t *)',可能是8或者4,與「數組大小」無關。您需要添加一個帶有元素數量的額外參數。 – 5gon12eder 2014-09-25 23:43:48

回答

0

正如@ 5gon12eder指出,我有我的尺寸,從而循環borked。最終的解決方案如下所示。可恥的是我沒有看屬於parse.h越早parse.c

int cmd_fork(tok_t arg[]) { 
    size_t size = 120; 
    int i, status = 0; 
    pid_t childPid; 
    char *nargs = (char *) malloc(size); 

    if ((childPid = fork()) == 0) { 
    printf("arg0: %s, arg1: %s\n", arg[0], arg[1]); 
    for (i=1; i < MAXTOKS && arg[i]; i++) { 
     if (i > 1) { 
     strcat(nargs, " "); 
     } 
     strcat(nargs, arg[i]); 
     printf("Nargs: %s\n", nargs); 
    } 
    execl(arg[0], arg[0], nargs, NULL); 
    _exit(127); 
    } 

    if (childPid > 0) { 
    waitpid(childPid, &status, 0);  
    printf("Exit status of process was %d\n", status); 
    } else { 

    printf("Child failed"); 
    } 

    return 0; 
}