新聞中心
在Linux系統(tǒng)中,我們通常使用exec命令來執(zhí)行一些程序或腳本。但是,當(dāng)我們執(zhí)行exec命令后,如何獲取它的返回值呢?這是一個(gè)值得我們深入探討的問題。

創(chuàng)新互聯(lián)主營三門網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app開發(fā)定制,三門h5重慶小程序開發(fā)公司搭建,三門網(wǎng)站營銷推廣歡迎三門等地區(qū)企業(yè)咨詢
在本文中,我們將會講解如何獲取exec命令的返回值,并介紹一些獲取返回值的方式和技巧。
1. 使用exit命令
我們可以在執(zhí)行完exec命令后,使用exit命令來返回一個(gè)狀態(tài)值。這個(gè)狀態(tài)值可以通過$?來獲取,其值為0表示執(zhí)行成功,其他值則表示執(zhí)行失敗。
這種方法的缺點(diǎn)在于,我們必須要在exec命令執(zhí)行完之后,再使用exit命令返回狀態(tài)值。這樣會稍微有點(diǎn)麻煩,也不夠優(yōu)雅。
2. 使用pipes
我們還可以利用Linux系統(tǒng)中的pipes來獲取exec命令的返回值。具體做法是,我們可以使用pipe()函數(shù)來創(chuàng)建一對管道,然后使用fork()函數(shù)來創(chuàng)建一個(gè)子進(jìn)程,在子進(jìn)程中執(zhí)行exec命令。
父進(jìn)程可以通過讀取管道來獲取子進(jìn)程執(zhí)行完后的返回值。代碼如下所示:
“`c
#include
#include
#include
int mn() {
int pipefd[2];
pid_t cpid;
char cmd[] = “l(fā)s”;
char *args[] = {“l(fā)s”, NULL};
char buf;
pipe(pipefd);
cpid = fork();
if (cpid == 0) {
/* 子進(jìn)程中執(zhí)行exec命令 */
close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);
execvp(cmd, args);
perror(“execvp”);
_exit(1);
} else {
/* 父進(jìn)程中讀取管道獲取返回值 */
close(pipefd[1]);
while (read(pipefd[0], &buf, 1) > 0) {
fwrite(&buf, 1, 1, stdout);
}
close(pipefd[0]);
}
return 0;
}
“`
這個(gè)例子中,我們在子進(jìn)程中執(zhí)行了一個(gè)ls命令,并將其輸出到管道中。父進(jìn)程則通過讀取管道來獲取輸出信息,并輸出到終端上。
3. 使用wtpid()函數(shù)
另外一種方法是通過wtpid()函數(shù)來等待子進(jìn)程執(zhí)行完畢,并獲取其返回值。代碼如下所示:
“`c
#include
#include
#include
#include
int mn() {
pid_t cpid, w;
int status;
char cmd[] = “l(fā)s”;
char *args[] = {“l(fā)s”, NULL};
cpid = fork();
if (cpid == 0) {
/* 子進(jìn)程中執(zhí)行exec命令 */
execvp(cmd, args);
perror(“execvp”);
_exit(1);
} else {
/* 父進(jìn)程中使用wtpid()函數(shù)等待子進(jìn)程,獲取返回值 */
w = wtpid(cpid, &status, WUNTRACED | WCONTINUED);
if (w == -1) {
perror(“wtpid”);
_exit(1);
}
if (WIFEXITED(status)) {
printf(“exited, status=%d\n”, WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf(“killed by signal %d\n”, WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
printf(“stopped by signal %d\n”, WSTOPSIG(status));
} else if (WIFCONTINUED(status)) {
printf(“continued\n”);
}
}
return 0;
}
“`
這個(gè)例子中,我們在父進(jìn)程中使用了wtpid()函數(shù)來等待子進(jìn)程執(zhí)行完畢,并獲取其返回值。我們利用WIFEXITED()函數(shù)來判斷返回值是否為0,如果是,則說明執(zhí)行成功。
相關(guān)問題拓展閱讀:
- Linux信號量
Linux信號量
信號量是包含一個(gè)非負(fù)整數(shù)型的變量,并且?guī)в袃蓚€(gè)原子操作wait和signal。Wait還可以被稱為down、P或lock,signal還可以被稱為up、V、unlock或post。在UNIX的API中(POSIX標(biāo)準(zhǔn))用的是wait和post。
對于wait操作,如果信號量的非負(fù)整形變量S大于0,wait就將其減1,如果S等于0,wait就將調(diào)用線程阻塞;對于post操作,如果有線程在信號量上阻塞(此時(shí)S等于0),post就會解除對某個(gè)等待線程的阻塞,使其從wait中返回,如果沒有線程阻塞在信號量上,post就將S加1.
由此可見,S可以被理解為一種資源的數(shù)量,信號量即是通過控制這種資源的分配來實(shí)現(xiàn)互斥和同步的。如果把S設(shè)為1,那么信號量即可使多線程并發(fā)運(yùn)行。另外,信號量不僅允許使用者申請和釋放資源,而且還允許使用者創(chuàng)豎嘩造資源,這就賦予了信號量實(shí)現(xiàn)同步的功能??梢娦盘柫康墓δ芤然コ饬控S富許多。
POSIX信號量是一個(gè)sem_t類型的變量,但POSIX有兩種信號量的實(shí)現(xiàn)機(jī)制:
無名信號量
和
命名信號量
。無名信號量只可以在共享內(nèi)存的情況下,比如實(shí)現(xiàn)進(jìn)程中各個(gè)線程之間的互斥和同步,因此無名信號量也被稱作基于內(nèi)存的信號量;命名信號量通常用于不共享內(nèi)存的情況下,比如進(jìn)程間通信。
同時(shí),在創(chuàng)建信號量時(shí),根據(jù)信號量取值的不同,POSIX信號量還可以分為:
下面是POSIX信號量函數(shù)接口:
信號量的函數(shù)都以sem_開頭,線程中使用的基本信號函數(shù)有4個(gè),他們都聲明在頭文件semaphore.h中,該頭文件定義了用于信號量操作的sem_t類型:
【sem_init函數(shù)】:
該函數(shù)用于創(chuàng)猜型建信號量,原型如下:
該函數(shù)初始化由sem指向的余兆行信號對象,設(shè)置它的共享選項(xiàng),并給它一個(gè)初始的整數(shù)值。pshared控制信號量的類型,如果其值為0,就表示信號量是當(dāng)前進(jìn)程的局部信號量,否則信號量就可以在多個(gè)進(jìn)程間共享,value為sem的初始值。
該函數(shù)調(diào)用成功返回0,失敗返回-1。
【sem_destroy函數(shù)】:
該函數(shù)用于對用完的信號量進(jìn)行清理,其原型如下:
成功返回0,失敗返回-1。
【sem_wait函數(shù)】:
該函數(shù)用于以原子操作的方式將信號量的值減1。原子操作就是,如果兩個(gè)線程企圖同時(shí)給一個(gè)信號量加1或減1,它們之間不會互相干擾。其原型如下:
sem指向的對象是sem_init調(diào)用初始化的信號量。調(diào)用成功返回0,失敗返回-1。
sem_trywait()則是sem_wait()的非阻塞版本,當(dāng)條件不滿足時(shí)(信號量為0時(shí)),該函數(shù)直接返回EAGAIN錯(cuò)誤而不會阻塞等待。
sem_timedwait()功能與sem_wait()類似,只是在指定的abs_timeout時(shí)間內(nèi)等待,超過時(shí)間則直接返回ETIMEDOUT錯(cuò)誤。
【sem_post函數(shù)】:
該函數(shù)用于以原子操作的方式將信號量的值加1,其原型如下:
與sem_wait一樣,sem指向的對象是由sem_init調(diào)用初始化的信號量。調(diào)用成功時(shí)返回0,失敗返回-1。
【sem_getvalue函數(shù)】:
該函數(shù)返回當(dāng)前信號量的值,通過restrict輸出參數(shù)返回。如果當(dāng)前信號量已經(jīng)上鎖(即同步對象不可用),那么返回值為0,或?yàn)樨?fù)數(shù),其絕對值就是等待該信號量解鎖的線程數(shù)。
【實(shí)例1】:
【實(shí)例2】:
之所以稱為命名信號量,是因?yàn)樗幸粋€(gè)名字、一個(gè)用戶ID、一個(gè)組ID和權(quán)限。這些是提供給不共享內(nèi)存的那些進(jìn)程使用命名信號量的接口。命名信號量的名字是一個(gè)遵守路徑名構(gòu)造規(guī)則的字符串。
【sem_open函數(shù)】:
該函數(shù)用于創(chuàng)建或打開一個(gè)命名信號量,其原型如下:
參數(shù)name是一個(gè)標(biāo)識信號量的字符串。參數(shù)oflag用來確定是創(chuàng)建信號量還是連接已有的信號量。
oflag的參數(shù)可以為0,O_CREAT或O_EXCL:如果為0,表示打開一個(gè)已存在的信號量;如果為O_CREAT,表示如果信號量不存在就創(chuàng)建一個(gè)信號量,如果存在則打開被返回,此時(shí)mode和value都需要指定;如果為O_CREAT|O_EXCL,表示如果信號量存在則返回錯(cuò)誤。
mode參數(shù)用于創(chuàng)建信號量時(shí)指定信號量的權(quán)限位,和open函數(shù)一樣,包括:S_IRUSR、S_IWUSR、S_IRGRP、S_IWGRP、S_IROTH、S_IWOTH。
value表示創(chuàng)建信號量時(shí),信號量的初始值。
【sem_close函數(shù)】:
該函數(shù)用于關(guān)閉命名信號量:
單個(gè)程序可以用sem_close函數(shù)關(guān)閉命名信號量,但是這樣做并不能將信號量從系統(tǒng)中刪除,因?yàn)槊盘柫吭趩蝹€(gè)程序執(zhí)行之外是具有持久性的。當(dāng)進(jìn)程調(diào)用_exit、exit、exec或從main返回時(shí),進(jìn)程打開的命名信號量同樣會被關(guān)閉。
【sem_unlink函數(shù)】:
sem_unlink函數(shù)用于在所有進(jìn)程關(guān)閉了命名信號量之后,將信號量從系統(tǒng)中刪除:
【信號量操作函數(shù)】:
與無名信號量一樣,操作信號量的函數(shù)如下:
命名信號量是隨內(nèi)核持續(xù)的。當(dāng)命名信號量創(chuàng)建后,即使當(dāng)前沒有進(jìn)程打開某個(gè)信號量,它的值依然保持,直到內(nèi)核重新自舉或調(diào)用sem_unlink()刪除該信號量。
無名信號量的持續(xù)性要根據(jù)信號量在內(nèi)存中的位置確定:
很多時(shí)候信號量、互斥量和條件變量都可以在某種應(yīng)用中使用,那這三者的差異有哪些呢?下面列出了這三者之間的差異:
linux exec返回值的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux exec返回值,如何獲取Linux exec命令的返回值,Linux信號量的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)公司提供專業(yè)的建站服務(wù),為您量身定制,歡迎來電(028-86922220)為您打造專屬于企業(yè)本身的網(wǎng)絡(luò)品牌形象。
成都創(chuàng)新互聯(lián)品牌官網(wǎng)提供專業(yè)的網(wǎng)站建設(shè)、設(shè)計(jì)、制作等服務(wù),是一家以網(wǎng)站建設(shè)為主要業(yè)務(wù)的公司,在網(wǎng)站建設(shè)、設(shè)計(jì)和制作領(lǐng)域具有豐富的經(jīng)驗(yàn)。
網(wǎng)頁名稱:如何獲取Linuxexec命令的返回值(linuxexec返回值)
瀏覽路徑:http://m.fisionsoft.com.cn/article/dpeipee.html


咨詢
建站咨詢
