argv[0]在什麼情況下不等於程式名
有一本書中說到:
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]=""
因此,書中的說法是正確的,又填補了一個知識空白。
相關文章
- 在什麼情況下用index unique scansIndex
- 在什麼情況下Java比C++快?JavaC++
- 在什麼情況下,Java比C++慢很多?JavaC++
- Linux中什麼情況下會發生程式排程?Linux
- Oracle什麼情況下需要rebuild indexOracleRebuildIndex
- 爬蟲在什麼情況下才需要使用代理IP爬蟲
- 企業在什麼情況下引入分散式資料庫?分散式資料庫
- 為什麼使用API?什麼情況下避免使用API?API
- 為什麼 NaN 不等於自身?NaN
- 什麼情況下你能接受 996996
- 什麼情況下進行效能測試
- 在什麼情況下可採取區塊鏈的流程圖 - TProphet區塊鏈流程圖
- 【知識分享】企業在什麼情況下需要做負載均衡負載
- Transactional replication 的Snapshot 檔案在什麼情況下會被清除
- composite模式在什麼樣的情況下比較適用啊模式
- Java類什麼情況下被初始化?Java
- 什麼情況下需要搭建大資料平臺大資料
- js中什麼情況下返回值是undefinedJSUndefined
- 什麼是java序列化?什麼情況下需要序列化?Java
- 為什麼大資料不等於BI?大資料
- Oracle like、不等於、隱式轉換走索引與不走索引情況Oracle索引
- 儲存過程裡呼叫編譯自己是什麼情況?儲存過程編譯
- 基於COST優化,oracle什麼情況不走索引優化Oracle索引
- 香港伺服器什麼情況下需要更新升級?伺服器
- 什麼情況!華為開源JDK!JDK
- Go 介面:nil介面為什麼不等於nil?Go
- Python 為什麼說 Eval 要慎用?使用 Eval 帶來的潛在風險?什麼情況下使用 Eval?Python
- vue什麼情況下需要用到this.$nextTickVue
- Snowflake(雪花演算法),什麼情況下會衝突?演算法
- MySQL什麼情況下刪除資料會釋放空間MySql
- 資料庫分割槽表 什麼情況下需要分割槽資料庫
- Oracle軟體安裝 - 什麼情況下需要relink allOracle
- 為什麼 JavaScript 中 0.1+0.2 不等於 0.3 ?JavaScript
- Go高階特性 12 | 指標詳解:在什麼情況下應該使用指標?Go指標
- Nature回應:為什麼在沒有程式碼的情況下發布AlphaFold3?
- 什麼情況讓程式設計師處於水深火熱中程式設計師
- (JavaScript)函式名裡有什麼?JavaScript函式
- oracle組合索引什麼情況下生效?Oracle索引