新聞中心
深入了解 linux exec 輸出

尼瑪網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司成立于2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
在 Linux 操作系統(tǒng)中,exec 是一個非常重要的函數(shù),用于執(zhí)行一個新進程時,替代當(dāng)前進程映像。當(dāng)一個進程調(diào)用 exec 函數(shù)時,它所在的用戶空間的代碼、數(shù)據(jù)和堆棧都會被替換成新進程的映像。這個新映像會從文件系統(tǒng)中加載到進程的內(nèi)存空間中,并開始執(zhí)行。
exec 函數(shù)的常見形式是 execl,該函數(shù)用于執(zhí)行一個可執(zhí)行文件并傳遞命令行參數(shù)。execl 的原型為:
“`
int execl(const char *path, const char *arg, /* (char *) NULL */ …);
“`
其中,path 是要執(zhí)行的可執(zhí)行文件的路徑名,arg 是要傳遞給該程序的命令行參數(shù),以 NULL 結(jié)尾。
在執(zhí)行 execl 函數(shù)時,它會將指定的可執(zhí)行文件加載到當(dāng)前進程的內(nèi)存空間中,并取代當(dāng)前進程映像。這意味著,新的程序開始運行時,它將具有與當(dāng)前進程相同的 PID、PPID 以及其他環(huán)境變量和打開的文件句柄。
除了 execl,其他常見的 exec 函數(shù)包括:
– execle:與 execl 相同,但允許明確指定環(huán)境變量。
– execlp:與 execl 相同,但允許在 PATH 環(huán)境變量中查找可執(zhí)行文件。
– execv:與 execl 區(qū)別在于,它是用數(shù)組傳遞命令行參數(shù)的。
– execvp:與 execlp 區(qū)別在于,它是用數(shù)組傳遞命令行參數(shù)的。
需要注意的是,exec 函數(shù)的調(diào)用會直接取代當(dāng)前進程的映像。因此,如果調(diào)用成功,它將永久地改變進程的行為,如果調(diào)用失敗,則當(dāng)前進程將繼續(xù)運行。
exec 的輸出
通過 exec 函數(shù)執(zhí)行的新進程在啟動時將繼承當(dāng)前進程的標(biāo)準(zhǔn)輸入、輸出和錯誤輸出文件描述符。這意味著,新進程將使用當(dāng)前進程打開的文件描述符進行輸入和輸出。
有時候,我們需要將執(zhí)行新進程時的輸出保存到文件中,以進行后續(xù)處理。這可以通過將標(biāo)準(zhǔn)輸出重定向到一個文件來實現(xiàn)。重定向可以通過 dup2 函數(shù)來設(shè)置。
“`
int dup2(int oldfd, int newfd);
“`
該函數(shù)將 oldfd 所指向的文件描述符復(fù)制到 newfd 中。如果 newfd 已經(jīng)打開,dup2 將關(guān)閉它并重復(fù)打開 oldfd 所描述的文件。
在執(zhí)行 execl 函數(shù)之前,我們需要先將標(biāo)準(zhǔn)輸出文件描述符重定向到文件中。示例如下:
“`c
#include
#include
#include
#include
#include
int mn()
{
int fd = open(“output.log”, O_WRON|O_CREAT|O_TRUNC, 0644);
if (fd
perror(“open”);
return -1;
}
if (dup2(fd, STDOUT_FILENO)
perror(“dup2”);
return -1;
}
close(fd);
execl(“/bin/ls”, “l(fā)s”, “-l”, (char *) NULL);
perror(“execl fled”);
return -1;
}
“`
該程序會將標(biāo)準(zhǔn)輸出重定向到名為 output.log 的文件中,并以 ls -l 的方式執(zhí)行 /bin/ls。執(zhí)行完程序后,輸出將被保存到 output.log 文件中。如果沒有重定向標(biāo)準(zhǔn)輸出,則輸出將打印到終端上。
相關(guān)問題拓展閱讀:
- 【exec】shell腳本中的 exec 命令
- linux的find -exec命令的問題
【exec】shell腳本中的 exec 命令
exec 是 bash 的內(nèi)置命令
shell 的內(nèi)件命令exec執(zhí)行命令時,不啟用新的shell進程。
source 和 . 不啟用新的shell,在當(dāng)前shell中執(zhí)行,設(shè)定的局部變量在執(zhí)行完命令后仍然有效。
bash 或 sh 或 shell script 執(zhí)行時,另起一個子shell,其繼承父shell的環(huán)境變量,其子shelll的變量執(zhí)行完后不影響父shell。
exec是用被執(zhí)行的命令行替換掉當(dāng)前的shell進程,且exec命令后的其他命令將不再執(zhí)行。
例如在當(dāng)前shell中執(zhí)行 exec ls 表示執(zhí)行l(wèi)s這條命令來替換當(dāng)前的shell ,即為執(zhí)行完后會退出當(dāng)前shell。
為了避免這個結(jié)果的影響,一般將exec命令放到一個shell腳本中,用主腳本調(diào)用這個腳本,調(diào)用處可以用bash xx.sh(xx.sh為存放exec命令的腳本),這樣會為xx.sh建立一個子shell去執(zhí)行,當(dāng)執(zhí)行exec后該子腳本進程就被替換成相應(yīng)的exec的命令。
其中有一個例外:當(dāng)exec命令對文件描述符操作的時候,就不會替換shell,而是操作完成后還會繼續(xù)執(zhí)行后面的命令!
在shell腳本中使用exec命令,根據(jù)操作的對象不同會有不同的行為
文件描述符
shell中描述符一共有12個
0 代表標(biāo)準(zhǔn)輸入
1 代表標(biāo)準(zhǔn)輸出
2 錯誤輸出
其他 3-9 都是空白描述符
# exec3>&1 4>&2 1>> bash.log 2>&1
其含義是: 復(fù)制標(biāo)準(zhǔn)輸出到3 ,錯誤輸出到 4 ,把 3 4 保存在bash.log 這個文件中。
# ./bash.sh >> bash.log 2>&1
其含義是:將bash.sh腳本執(zhí)行的標(biāo)準(zhǔn)輸出和錯誤輸出追加重定向到 bash.log
如果exec 跟的是其他命令,則其他命令結(jié)束后,本shell也隨之停止
# cat test_exec.sh
###################
#!/bin/bash
#
echo “Hello mysql”
exec echo “Hello oracle”
echo “Hello sqlserver”
####################
可以看到隨著 echo ” hello oracle” 這條指令運行完本 整個腳本執(zhí)行完畢,后面的 echo ” hello db2″ 沒有執(zhí)行!
Linux shell 腳本中, $@ 和$# 分別是什么意思?
$@ 表示所有腳本參數(shù)的內(nèi)容
$# 表示返回所有腳本參數(shù)的個數(shù)
示例:編寫如下shell腳本,保存為test.sh
###############
#!/bin/sh
echo “number:$#”
echo “argume:$@”
###############
執(zhí)行腳本:
./test.sh first_arg second_arg
說明:給腳本提供了兩個參數(shù),所以$#輸出的結(jié)果是2,$@代表了參數(shù)的內(nèi)手冊容!
怎么理解shell腳本中 exec “`dirname “$0″`/node””$0” “$@” ?
$# 腳本自己的路徑
“`dirname “$0″`”/node # 腳本目錄下的node程序的路徑
$@# 腳本被執(zhí)行時的命令行參數(shù)
合起來就是:用腳本目錄下的node程序來解釋這個腳本本身
exec scala “$0” “$@”是什么意思
這是bash語法。
$0 表示當(dāng)前腳本的名字
$@ 表示當(dāng)前腳本執(zhí)沒前行的所有參數(shù)
exec scala “$0” “$@” 表示用scala命令,帶參數(shù),執(zhí)行當(dāng)前腳本
exec sh “$0 在這個文件里,exec sh $0是什么意思?
############
#!/bin/sh
echo “Hello!”
sleep 2
execsh 畢察宏”$0″
#############
$0 是位置參數(shù),表示腳本名稱
$1 表示腳本的之一個參數(shù),依次類推直到$9
exec用于執(zhí)行命令、或腳本、或外部可執(zhí)行程序,會新建一個shell去執(zhí)行
綜上,這里exec sh “$0” 就是執(zhí)行腳本本身
所以,就是一個循環(huán)過程,每隔兩秒打印一次 Hello
#############
#!/bin/sh
echo “Hello!”
sleep 2
exec “$0”
#############
linux的find -exec命令的問題
find . -size +c -exec cp /dev/null {} \;
這茄信條指令毀納瞎是將找纖空到的清除
find . -size +200M -exec /bin/cp /dev/null {} \;
試試truncate
find 宏尺源. -size +c -exec 困蘆truncate {} –size 0 蔽態(tài)\;
linux exec 輸出的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux exec 輸出,「深入了解 Linux exec 輸出」,【exec】shell腳本中的 exec 命令,linux的find -exec命令的問題的信息別忘了在本站進行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
文章名稱:「深入了解Linuxexec輸出」(linuxexec輸出)
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/dpddcgo.html


咨詢
建站咨詢
