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

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


咨詢
建站咨詢
