argv[0]在什麼情況下不等於程式名

lt發表於2013-05-20

有一本書中說到:

Command-line arguments are passed to main() as pointers to null-terminated strings in the array members argv[0] through argv[argc-1]. If the value of argc is greater than 0, the string pointed to by argv[0] is, by convention, the program name.

但我覺得argc,argv在沒有被程式碼修改之前,argc大於0,argv[0]等於程式名,所以下面這個程式還是多餘的。

01  int main(int argc, char *argv[]) {
02    /* Do not assume that argv[0] cannot be null */
03    const char * const name = argv[0] ? argv[0] : "";
04    char *prog_name = (char *)malloc(strlen(name) + 1);
05    if (prog_name != NULL) {
06      strcpy(prog_name, name);
07    }
08    else {
09        /* Failed to allocate memory - recover */
10    }
11    /* ... */
12  }

其實這個理解不對,在有些情況下,確實可以實現。比如chinaunix網友所說的下面的程式碼

#include<unistd.h>
int main()
{
execlp("./a","",(char *)0);
}

--這是被execlp呼叫的程式程式碼
[oracle@redflag11012501 ~]$ vi aa.c
#include<stdio.h>
int main(int argc,char *argv[])
{
printf("argc=\"%d\"\n",argc);
printf("argv[0]=\"%s\"\n",argv[0]);
}


"aa.c" [新] 6L, 120C 已寫入  
[oracle@redflag11012501 ~]$ gcc aa.c
--正常通過命令列呼叫的結果
[oracle@redflag11012501 ~]$ ./a.out
argc="1"
argv[0]="./a.out"
[oracle@redflag11012501 ~]$ mv a.out a
[oracle@redflag11012501 ~]$ vi bb.c
#include<unistd.h>
int main()
{
execlp("./a",(char *)0);
}


"bb.c" [新] 5L, 59C 已寫入  
[oracle@redflag11012501 ~]$ gcc bb.c
--通過execlp("./a",(char *)0)呼叫a
[oracle@redflag11012501 ~]$ ./a.out
argc="0"
argv[0]="(null)"
[oracle@redflag11012501 ~]$ 

[oracle@redflag11012501 ~]$ vi bb.c
#include<unistd.h>
int main()
{
execlp("./a","",(char *)0);
}

"bb.c" 5L, 62C 已寫入  
[oracle@redflag11012501 ~]$ gcc bb.c
--通過execlp("./a","",(char *)0)呼叫a
[oracle@redflag11012501 ~]$ ./a.out
argc="1"
argv[0]=""

因此,書中的說法是正確的,又填補了一個知識空白。 c99標準第12頁

相關文章