亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux進(jìn)程控制簡(jiǎn)介與要素及相關(guān)函數(shù)詳解

GReq_mcu168 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:碼農(nóng)愛(ài)學(xué)習(xí) ? 2021-04-03 10:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux進(jìn)程簡(jiǎn)介

進(jìn)程是操作系統(tǒng)中的一個(gè)重要概念,它是一個(gè)程序的一次執(zhí)行過(guò)程,程序是進(jìn)程的一種靜態(tài)描述,系統(tǒng)中運(yùn)行的每一個(gè)程序都是在它的進(jìn)程中運(yùn)行的。

進(jìn)程4要素

要有一段程序供該進(jìn)程運(yùn)行

進(jìn)程專(zhuān)用的系統(tǒng)堆??臻g

進(jìn)程控制塊(PCB),具體實(shí)現(xiàn)是task_struct結(jié)構(gòu)

有獨(dú)立的存儲(chǔ)空間

Linux系統(tǒng)中所有的進(jìn)程是相互聯(lián)系的,除了初始化進(jìn)程外,所有進(jìn)程都有一個(gè)父進(jìn)程。新的進(jìn)程不是被創(chuàng)建,而是被復(fù)制,或是從以前的進(jìn)程復(fù)制而來(lái)。Linux中所有的進(jìn)程都是由一個(gè)進(jìn)程號(hào)為1的init進(jìn)程衍生而來(lái)的。

Linux系統(tǒng)包括3種不同類(lèi)型的進(jìn)程,每種進(jìn)程都有自己的特點(diǎn)和屬性:

交互進(jìn)程:由一個(gè)Shell啟動(dòng)的進(jìn)程,既可以在前臺(tái)運(yùn)行,又可以在后臺(tái)運(yùn)行

批處理進(jìn)程:這種進(jìn)程和終端沒(méi)有聯(lián)系,是一個(gè)進(jìn)程序列

監(jiān)控進(jìn)程(守護(hù)進(jìn)程):Linux啟動(dòng)時(shí)啟動(dòng)的進(jìn)程,并在后臺(tái)運(yùn)行

進(jìn)程控制塊

在Linux中,每個(gè)進(jìn)程在創(chuàng)建時(shí)都會(huì)被分配一個(gè)數(shù)據(jù)結(jié)構(gòu),稱(chēng)為進(jìn)程控制塊(PCB, Process Control Block),描述進(jìn)程的運(yùn)動(dòng)變化過(guò)程,與進(jìn)程是一一對(duì)應(yīng)的關(guān)系。通常PCB包含以下信息:

進(jìn)程標(biāo)識(shí)符:每個(gè)進(jìn)程的唯一標(biāo)識(shí)符,可以是字符串,也可以是數(shù)字。

進(jìn)程當(dāng)前狀態(tài):為方便管理,相同狀態(tài)的進(jìn)程會(huì)組成一個(gè)隊(duì)列,如就緒進(jìn)程隊(duì)列。

進(jìn)程相應(yīng)的程序和數(shù)據(jù)地址:以便把PCB與其程序和數(shù)據(jù)聯(lián)系起來(lái)。

進(jìn)程資源清單:列出所有除CPU外的資源記錄,如擁有的I/O設(shè)備,打開(kāi)的文件列表等。

進(jìn)程優(yōu)先級(jí):反映進(jìn)程的緊迫程度,通常由用戶(hù)指定和系統(tǒng)設(shè)置。

CPU現(xiàn)場(chǎng)保護(hù)區(qū):當(dāng)進(jìn)程因某種原因不能繼續(xù)占用CPU時(shí),釋放CPU,需要將CPU的各種狀態(tài)信息保護(hù)起來(lái)。

進(jìn)程同步與通信機(jī)制:用于實(shí)現(xiàn)進(jìn)程間互斥、同步和通信所需的信號(hào)量等。

進(jìn)程所在隊(duì)列PCB的鏈接字:根據(jù)進(jìn)程所處的現(xiàn)行狀態(tài),進(jìn)程相應(yīng)的PCB參加到不同隊(duì)列中,PCB鏈接字指出該進(jìn)程所在隊(duì)列中下一進(jìn)程PCB的首地址。

與進(jìn)程有關(guān)的其它信息:如進(jìn)程記賬信息,進(jìn)程占用CPU的時(shí)間等。

通過(guò)ps命令可以查看系統(tǒng)中目前有多少進(jìn)程正常運(yùn)行

通過(guò)ps-aux命令可以查看每個(gè)進(jìn)程的詳細(xì)信息

進(jìn)程控制的相關(guān)函數(shù)

fork()函數(shù)

系統(tǒng)調(diào)用fork()函數(shù)派生一個(gè)進(jìn)程,函數(shù)原型為:

#include 《sys/types.h》

#include 《unistd.h》

pid_t fork(void);

運(yùn)行成功,父進(jìn)程返回子進(jìn)程ID,子進(jìn)程飯0;運(yùn)行出錯(cuò)返回-1。

fork系統(tǒng)調(diào)用的作用是復(fù)制一個(gè)進(jìn)程,從而出現(xiàn)兩個(gè)幾乎一樣的進(jìn)程。一般來(lái)說(shuō),fork后是父進(jìn)程先執(zhí)行還是子進(jìn)程先執(zhí)行是不確定的,取決于內(nèi)核所實(shí)使用的調(diào)度算法

fork函數(shù)示例,fork_test.c:

#include 《sys/types.h》

#include 《stdio.h》

#include 《stdlib.h》

#include 《unistd.h》

int main(void)

{

int count = 0;

pid_t pid;

pid = fork();

if(pid 《 0)

{

printf(“error in fork!”);

exit(1);

}

else if(pid == 0)

printf(“I am the child process, the count is %d, my process ID is%d

”, count, getpid());

else

printf(“I am the parent process, the count is %d, my process ID is%d

”, ++count, getpid());

return 0;

}

編譯后運(yùn)行:

$ 。/fork_test

I am the parent process, the count is 1, my process ID is2308

I am the child process, the count is 0, my process ID is2309

在語(yǔ)句pid = fork();之前,只有一個(gè)進(jìn)程在執(zhí)行代碼,但在該語(yǔ)句之后,有兩個(gè)進(jìn)程在執(zhí)行之后的代碼,根據(jù)pid的不同執(zhí)行不同的語(yǔ)句。

fork調(diào)用的神奇之處在于被調(diào)用一次,能夠返回兩次,返回結(jié)果可能有3種情況:

父進(jìn)程中:fork返回新創(chuàng)建的子進(jìn)程的ID

子進(jìn)程中:fork返回0

出現(xiàn)錯(cuò)誤:fork返回負(fù)值

fork出錯(cuò)的原因有2:

當(dāng)前進(jìn)程數(shù)已達(dá)系統(tǒng)規(guī)定的上限,此時(shí)errno的值被設(shè)置為EAGAIN

系統(tǒng)內(nèi)存不足,此時(shí)errno的值被設(shè)置為ENOMEN

errno是Linux下的一個(gè)宏定義常量,當(dāng)Linux中C API函數(shù)發(fā)生異常時(shí),一般會(huì)將errno變量賦值為一個(gè)正整數(shù)(需include),不同的值表示不同的含義,通過(guò)查看該值可推測(cè)出錯(cuò)原因。

vfork()函數(shù)

vfork()與fork()的區(qū)別是:fork()需要復(fù)制父進(jìn)程的數(shù)據(jù)段,而vfork()不需要完全復(fù)制,在子進(jìn)程調(diào)用exec()或exit()之前,子進(jìn)程與父進(jìn)程共享數(shù)據(jù)段。fork()不對(duì)父子進(jìn)程的執(zhí)行次序作限制,而vfork()調(diào)用后,子進(jìn)程先運(yùn)行,父進(jìn)程掛起,直到子進(jìn)程調(diào)用了exec()或exit()后,父子進(jìn)程的執(zhí)行次序才不再有限制。

實(shí)際上,vfork()創(chuàng)建出的不是真正意義的進(jìn)程,它缺少了進(jìn)程4要素的最后一項(xiàng)——獨(dú)立的內(nèi)存資源。

vfork()創(chuàng)建父子進(jìn)程共享數(shù)據(jù)段測(cè)試,vfork_test1.c():

#include 《sys/types.h》

#include 《stdio.h》

#include 《stdlib.h》

#include 《unistd.h》

int main(void)

{

int count = 1;

int child;

printf(“Before create son, the father‘s count is:%d

”, count);

child = vfork();

if(child 《 0)

{

printf(“error in vfork!”);

exit(1);

}

if(child == 0)

{

printf(“This is son, his pid is:%d and the count is:%d

”, getpid(),++ count);

exit(1);

}

else

printf(“After son, This is father, his pid is:%d and the count is:%d, and the child is:%d

”, getpid(), count, child);

return 0;

}

編譯后運(yùn)行:

$ 。/vfork_test1

Before create son, the father’s count is:1

This is son, his pid is:2530 and the count is:2

After son, This is father, his pid is:2529 and the count is:2, and the child is:2530

可以看出,在子進(jìn)程中修改了count的值,變?yōu)?,而父進(jìn)程中count值也為2,說(shuō)明父子進(jìn)程共享count,即父子進(jìn)程共享內(nèi)存區(qū)。

vfork()創(chuàng)建子進(jìn)程導(dǎo)致父進(jìn)程掛起測(cè)試,vfork_test2():

#include 《sys/types.h》

#include 《stdio.h》

#include 《stdlib.h》

#include 《unistd.h》

int main(void)

{

int count = 1;

int child;

printf(“Before create son, the father‘s count is:%d

”, count);

if(?。╟hild = vfork()))

{

int i;

for(i=0; i《100; i++)

{

printf(“This is son, the i is:%d

”, i);

if(i == 70)

exit(1);

}

printf(“This is son, his pid is:%d and the count is:%d

”, getpid(), ++count);

exit(1);

}

else

printf(“After son, This is father, his pid is:%d and the count is:%d, and the child is:%d

”, getpid(), count, child);

return 0;

}

編譯后運(yùn)行:

$ 。/vfork_test2

Before create son, the father’s count is:1

This is son, the i is:0

This is son, the i is:1

This is son, the i is:2

。..省略

This is son, the i is:67

This is son, the i is:68

This is son, the i is:69

This is son, the i is:70

After son, This is father, his pid is:2541 and the count is:1, and the child is:2542

可以看出,父進(jìn)程是等待子進(jìn)程執(zhí)行完畢后才開(kāi)始執(zhí)行。

exec函數(shù)族

Linux使用exec函數(shù)族來(lái)執(zhí)行新的程序,以新的子進(jìn)程來(lái)完全代替原有的進(jìn)程,exec函數(shù)族包含6個(gè)函數(shù):

#include 《unistd.h》

int execl(const char *pathname, const char *arg, 。..);

int execlp(const char *filename, const char *arg, 。..);

int execle(const char *pathname, const char *arg, 。.., char *const envp[]);

int execv(const char *pathname, char *const argv[]);

int execvp(const char *filename, char *const argv[]);

int execve(const char *pathname, char *const argv[], char *const envp[]);

運(yùn)行成功無(wú)返回,出錯(cuò)返回-1。

函數(shù)中含義字母l的:其參數(shù)個(gè)數(shù)不定,參數(shù)由命令行參數(shù)列表組成,最v后一個(gè)NULL表示結(jié)束。

函數(shù)中含義字母v的:使用一個(gè)字符串?dāng)?shù)組指針argv指向參數(shù)列表,與含字母l的函數(shù)參數(shù)列表完全相同。

函數(shù)中含義字母p的:可以自動(dòng)在環(huán)境變量PATH指定的路徑中搜索要執(zhí)行的程序,其第一參數(shù)filename為可執(zhí)行函數(shù)的文件名,注意其它函數(shù)的第一個(gè)參數(shù)pathname為路徑名

函數(shù)中含義字母e的:比其它函數(shù)多了一個(gè)字符串指針型的envp參數(shù),用于指定環(huán)境變量。

實(shí)際上,只有execve()函數(shù)才是真正意義上的系統(tǒng)調(diào)用,其它都是在此基礎(chǔ)上經(jīng)過(guò)包裝的庫(kù)函數(shù)。與一般情況不同,exec函數(shù)族執(zhí)行成功后不會(huì)返回,因?yàn)檎{(diào)用進(jìn)程實(shí)體,包括代碼段、數(shù)據(jù)段和堆棧段都被新的內(nèi)容取代,只是進(jìn)程ID等一些表面上的信息仍保持原樣。

exec函數(shù)族使用舉例,exec_example.c:

#include 《unistd.h》

#include 《stdio.h》

int main(void)

{

char *envp[] = {“PATH=/tmp”, “USER=root”, “STATUS=testing”, NULL};

char *argv_execv[] = {“echo”, “excuted by execv”, NULL};

char *argv_execvp[] = {“echo”, “excuted by execvp”, NULL};

char *argv_execve[] = {“env”, NULL};

if(fork()==0)

{

if(execl(“/bin/echo”, “echo”, “executed by execl”, NULL))

perror(“Err on execl”);

}

if(fork()==0)

{

if(execlp(“echo”, “echo”, “executed by execlp”, NULL))

perror(“Err on execlp”);

}

if(fork()==0)

{

if(execle(“/usr/bin/env”, “env”, NULL, envp))

perror(“Err on execle”);

}

if(fork()==0)

{

if(execv(“/bin/echo”, argv_execv))

perror(“Err on execv”);

}

if(fork()==0)

{

if(execvp(“echo”, argv_execvp))

perror(“Err on execvp”);

}

if(fork()==0)

{

if(execve(“/usr/bin/env”, argv_execve, envp))

perror(“Err on execve”);

}

return 0;

}

上述程序用到了perror()函數(shù),它用來(lái)將函數(shù)發(fā)生錯(cuò)誤的原因輸出到標(biāo)準(zhǔn)輸出(stderr),其函數(shù)原型為:

《pre class=“l(fā)ang_c”》#include 《stdio.h》

void perror(const char *s)

```

編譯后執(zhí)行:

$ 。/exec_example

PATH=/tmp

USER=root

STATUS=testing

executed by execl

executed by execlp

$ PATH=/tmp

USER=root

STATUS=testing

excuted by execvp

excuted by execv

由于各子進(jìn)程執(zhí)行的順序無(wú)法控制,因而每次運(yùn)行結(jié)果的輸出順序會(huì)有不同。

使用exec函數(shù)族,一般要加上錯(cuò)誤判斷語(yǔ)句,因?yàn)閑xec函數(shù)易由多種原因運(yùn)行失?。?/p>

找不到文件或路徑:errno被設(shè)置為ENOENT

數(shù)組argv和envp忘記使用NULL結(jié)束:errno被設(shè)置為EFAULT

沒(méi)有文件的運(yùn)行權(quán)限:errno被設(shè)置為EACCES

exit()與_exit()函數(shù)

這兩個(gè)函數(shù)都是用于終止進(jìn)程,其定義分別為:

#include 《stdlib.h》

void exit(int status);

#include 《unistd.h》

void _exit(int status);

兩者主要區(qū)別在于:

定義及所需頭文件不同

_exit()立即進(jìn)入內(nèi)核;exit()則先執(zhí)行一些清除處理(包括調(diào)用執(zhí)行個(gè)終止處理程序,關(guān)閉所有標(biāo)準(zhǔn)I/O流等),然后進(jìn)入內(nèi)核。

exit()在調(diào)用之前要檢查文件的打開(kāi)情況,把文件緩沖區(qū)的內(nèi)容寫(xiě)回文件;_exit()則直接使進(jìn)程停止,清除其使用的內(nèi)存空間,并銷(xiāo)毀其在內(nèi)核中的各種數(shù)據(jù)結(jié)構(gòu)。

在Linux的標(biāo)準(zhǔn)函數(shù)庫(kù)中,有一套被稱(chēng)為“高級(jí)I/O的函數(shù)”,如printf()、fopen()等,也被稱(chēng)為“緩沖I/O(buffered I/O)”,其特征是對(duì)應(yīng)每一個(gè)打開(kāi)的文件,在內(nèi)存中都有一片緩沖區(qū),每次會(huì)多讀出若干條記錄,當(dāng)達(dá)到一定的條件(如達(dá)到一定數(shù)量,或遇到特定字符,如‘ ’和文件結(jié)束符EOF)時(shí),再將緩沖區(qū)的內(nèi)容一次性寫(xiě)入文件,從而增加讀寫(xiě)速度。但是,這種情況下,如果使用_exit()退出,會(huì)導(dǎo)致某些數(shù)據(jù)未被保存,而用exit()則不會(huì)有問(wèn)題。

exit()與_exit()函數(shù)的區(qū)別測(cè)試,exit_differ.c:

#include 《sys/types.h》

#include 《stdio.h》

#include 《stdlib.h》

#include 《unistd.h》

int main(void)

{

pid_t pid;

if((pid=fork()) == -1)

{

printf(“failed to create a new process

”);

exit(0);

}

else if(pid == 0)

{

printf(“

child process, output begin

”);

printf(“child process, content in buffer”);

_exit(0);

}

else

{

printf(“parent process, output begin

”);

printf(“parent process, content in buffer”);

exit(0);

}

return 0;

}

編譯后執(zhí)行:

$ 。/exit_differ

parent process, output begin

parent process, content in buffer

child process, output begin

由于printf函數(shù)遇到’ ‘時(shí)才從緩沖區(qū)讀取數(shù)據(jù),在子進(jìn)程中,因?yàn)開(kāi)exit(0)直接將緩沖區(qū)的內(nèi)容清除了,內(nèi)容沒(méi)有顯示;而父進(jìn)程中,執(zhí)行exit(0)之前會(huì)先將緩沖區(qū)的內(nèi)容顯示出來(lái)。

wait()與waitpid()函數(shù)

在一個(gè)進(jìn)程調(diào)用了exit()之后,該進(jìn)程并非立即消失,而是留下一個(gè)僵尸進(jìn)程(Zombie)的數(shù)據(jù)結(jié)構(gòu),這時(shí)的一種處理方法就是使用wait()和waitpid()函數(shù)。

僵尸態(tài)是進(jìn)程的一種特殊狀態(tài),沒(méi)有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程中保留一個(gè)位置,記載改進(jìn)程的退出狀態(tài)等信息供其它進(jìn)程收集。

wait()和waitpid()函數(shù)原型:

#include 《sys/types.h》

#include 《sys/wait.h》

pid_t wait(int *status);

pid_t waitpid(pid_t, int *status, int options);

運(yùn)行成功返回進(jìn)程ID,出錯(cuò)返回-1。

參數(shù)status用于保存進(jìn)程退出時(shí)的一些狀態(tài),如果只是想把進(jìn)程滅掉,可以設(shè)置該參數(shù)為NULL。

參數(shù)pid用于指定所等待的線(xiàn)程。

pid取值含義

pid 》 0只等待進(jìn)程ID為pid的子線(xiàn)程

pid = -1等待任何一個(gè)子線(xiàn)程,此時(shí)waitpid等價(jià)于wait

pid = 0等待同一個(gè)進(jìn)程組中的任何子進(jìn)程

pid 《 -1等待一個(gè)指定進(jìn)程組中的任何子進(jìn)程,其進(jìn)程ID為pid的絕對(duì)值

參數(shù)options提供一些額外的選項(xiàng)來(lái)控制waitpid,包括WNOHANG和WUNTRACED兩個(gè)選項(xiàng),這是兩個(gè)常數(shù),可以用|運(yùn)算符連接使用。其中WNOHANG參數(shù)用于設(shè)置不等待子進(jìn)程退出,立即返回,此時(shí)waitpid返回0;WUNTRACED參數(shù)用于配置跟蹤調(diào)試。

進(jìn)程一旦調(diào)用wait后,就立刻阻塞自己,如果當(dāng)前進(jìn)程的某個(gè)子進(jìn)程已退出,則收集其信息,否則wait會(huì)一種阻塞在這里,直到有一個(gè)僵死進(jìn)程出現(xiàn)。

wait()示例

wait_example.c:

#include 《sys/types.h》

#include 《sys/wait.h》

#include 《stdio.h》

#include 《stdlib.h》

#include 《unistd.h》

int main(void)

{

pid_t pc, pr;

if((pc = fork()) 《 0)

{

printf(“error in fork!”);

exit(1);

}

else if(pc == 0)

{

printf(“This is child process with pid of %d

”, getpid());

sleep(10);

}

else

{

pr = wait(NULL);

printf(“I catched a child process with pid of %d

”, pr);

}

exit(0);

}

編譯后執(zhí)行:

$ 。/wait_example

This is child process with pid of 10093

I catched a child process with pid of 10093

可以看到,第1行輸出后,等待大約10秒,第2行才輸出,這10秒就是子線(xiàn)程的睡眠時(shí)間。

waitpid()示例

父進(jìn)程和子進(jìn)程分別睡眠10秒鐘和1秒鐘,代表所作的相應(yīng)工作。父進(jìn)程利用工作的簡(jiǎn)短間歇查看子進(jìn)程是否退出,如果退出就收集它。waitpid_example.c:

#include 《sys/types.h》

#include 《sys/wait.h》

#include 《stdio.h》

#include 《stdlib.h》

#include 《unistd.h》

int main(void)

{

pid_t pc, pr;

if((pc = fork()) == -1)

{

printf(“failed to create a new process”);

exit(0);

}

else if(pc == 0)

{

sleep(10);

exit(0);

}

do

{

pr = waitpid(pc, NULL, WNOHANG);

if(pr == 0)

{

printf(“No chiled exited

”);

sleep(1);

}

}while(pr == 0);

if(pr == pc)

printf(“successfully get child %d

”, pr);

else

printf(“some error occured

”);

return 0;

}

sdfgh

$ 。/waitpid_example

No chiled exited

No chiled exited

No chiled exited

No chiled exited

No chiled exited

No chiled exited

No chiled exited

No chiled exited

No chiled exited

No chiled exited

successfully get child 2711

可以看到,父進(jìn)程經(jīng)過(guò)10次失敗嘗試后,終于收集到了退出的子進(jìn)程。

獲取子進(jìn)程返回狀態(tài)

對(duì)于wait()和waitpid()中的status參數(shù),當(dāng)其值不為NULL時(shí),子進(jìn)程的退出狀態(tài)會(huì)以int值的形式保存其中,通過(guò)一套專(zhuān)門(mén)的宏(macro)可以讀取存入的狀態(tài)值,這里只列舉兩個(gè)常用的宏:

宏定義含義

WIFEXITED(status)子進(jìn)程正常退出時(shí),返回一個(gè)非零值,否則返回零

WEXITSTATUS(status)當(dāng)WIFEXITED為真時(shí),此宏才可用,返回該進(jìn)程退出的代碼

示例,子進(jìn)程調(diào)用exit(3)退出,WIFEXITED(status)指示子進(jìn)程正常退出,WEXITSTATUS(status)就會(huì)返回3。get_status.c:

#include 《sys/types.h》

#include 《sys/wait.h》

#include 《stdio.h》

#include 《stdlib.h》

#include 《unistd.h》

int main(void)

{

int status;

pid_t pc, pr;

if((pc = fork()) 《 0)

{

printf(“error in fork!”);

exit(1);

}

else if(pc == 0)

{

printf(“This is child process with pid of %d.

”, getpid());

exit(3);

}

else

{

pr = wait(&status);

if(WIFEXITED(status))

{

printf(“the child process %d exit normally.

”, pr);

printf(“the return code is %d.

”, WEXITSTATUS(status));

}

else

printf(“the child process %d exit abnormally.

”, pr);

}

return 0;

}

assvf

$ 。/get_status

This is child process with pid of 2718.

the child process 2718 exit normally.

the return code is 3.

可以看出,父進(jìn)程捕捉到了子進(jìn)程的返回值3。

system()函數(shù)

函數(shù)原型:

#include 《stdlib.h》

int system(const char *cmdstring);

sysytem()調(diào)用fork()產(chǎn)生子進(jìn)程,由子進(jìn)程來(lái)調(diào)用/bin/sh-cmdstring來(lái)執(zhí)行參數(shù)cmdstring字符串所代表的命令,此命令執(zhí)行完后隨即返回原調(diào)用的進(jìn)程。

編程示例,4次調(diào)用system,設(shè)置不同的命令行參數(shù),system返回不同的結(jié)果,cmd_system.c:

#include 《stdio.h》

#include 《stdlib.h》

int main(void)

{

int status;

if((status = system(NULL)) 《 0)

{

printf(“system error!

”);

exit(0);

}

printf(“exit status=%d

”, status);

if((status = system(“date”)) 《 0)

{

printf(“system error!

”);

exit(0);

}

printf(“exit status=%d

”, status);

if((status = system(“invalidcommand”)) 《 0)

{

printf(“system error!

”);

exit(0);

}

printf(“exit status=%d

”, status);

if((status = system(“who; exit 44”)) 《 0)

{

printf(“system error!

”);

exit(0);

}

printf(“exit status=%d

”, status);

return 0;

}

adss

$ 。/cmd_system

exit status=1

2019年 12月 10日 星期二 1436 CST

exit status=0

sh: 1: invalidcommand: not found

exit status=32512

deeplearning pts/0 2019-12-10 13:46 (192.168.1.110)

exit status=11264

第1次調(diào)用system,參數(shù)為NULL,返回結(jié)果為1,說(shuō)明在本Linux系統(tǒng)下system可用;第2次調(diào)用system,參數(shù)為data,system成功執(zhí)行;第3次調(diào)用system,參數(shù)為一個(gè)非法的字符串命令,返回結(jié)果shell的終止?fàn)顟B(tài)(命令出錯(cuò))32512;第4次調(diào)用system,參數(shù)為who,顯示登錄用戶(hù)情況,exit 44是退出當(dāng)前的shell,system成功返回,返回值11264。

參考:《精通Linux C編程》- 程國(guó)鋼
編輯:lyn

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11593

    瀏覽量

    217414
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4404

    瀏覽量

    66637
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    682

    瀏覽量

    34899

原文標(biāo)題:Linux進(jìn)程控制

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    是德頻譜分析儀的遠(yuǎn)程控制與自動(dòng)化測(cè)試方案詳解

    ,遠(yuǎn)程控制與自動(dòng)化測(cè)試成為了現(xiàn)代測(cè)試系統(tǒng)中不可或缺的一部分。以下是關(guān)于是德頻譜分析儀遠(yuǎn)程控制與自動(dòng)化測(cè)試方案的詳細(xì)解析。 ? 一、遠(yuǎn)程控制基礎(chǔ) 遠(yuǎn)程控制是通過(guò)網(wǎng)絡(luò)或特定的接口,實(shí)現(xiàn)對(duì)頻
    的頭像 發(fā)表于 06-19 15:16 ?519次閱讀
    是德頻譜分析儀的遠(yuǎn)<b class='flag-5'>程控制</b>與自動(dòng)化測(cè)試方案<b class='flag-5'>詳解</b>

    詳解Linux權(quán)限相關(guān)指令

    Linux嚴(yán)格來(lái)說(shuō)是一個(gè)操作系統(tǒng),我們稱(chēng)之為“核心”(kernel)。而作為用戶(hù)的我們并不能直接與核心交流,這時(shí)候就有一個(gè)中間人的角色出現(xiàn):將我們的指令翻譯為核心可以看懂的符號(hào),交由核心執(zhí)行,并將執(zhí)行結(jié)果翻譯并返回給我們。
    的頭像 發(fā)表于 06-06 11:47 ?741次閱讀
    <b class='flag-5'>詳解</b><b class='flag-5'>Linux</b>權(quán)限<b class='flag-5'>相關(guān)</b>指令

    詳解Linux系統(tǒng)中的服務(wù)管理

    Linux中,無(wú)論何時(shí)當(dāng)你安裝任何帶有服務(wù)和守護(hù)進(jìn)程的包,系統(tǒng)默認(rèn)會(huì)把這些服務(wù)的初始化及 systemd腳本添加進(jìn)去,不過(guò)此時(shí)它們并沒(méi)有被啟用。
    的頭像 發(fā)表于 05-23 15:10 ?561次閱讀
    <b class='flag-5'>詳解</b><b class='flag-5'>Linux</b>系統(tǒng)中的服務(wù)管理

    Linux后臺(tái)進(jìn)程管理詳解

    當(dāng)我們?cè)诮K端或控制臺(tái)工作時(shí),可能不希望由于運(yùn)行一個(gè)作業(yè)而占住了屏幕,因?yàn)榭赡苓€有更重要的事情要做,比如閱讀電子郵件。對(duì)于密集訪(fǎng)問(wèn)磁盤(pán)的進(jìn)程,我們更希望它能夠在每天的非負(fù)荷高峰時(shí)間段運(yùn)行(例如凌晨)。為了使這些進(jìn)程能夠在后臺(tái)運(yùn)行,
    的頭像 發(fā)表于 04-25 11:04 ?711次閱讀
    <b class='flag-5'>Linux</b>后臺(tái)<b class='flag-5'>進(jìn)程</b>管理<b class='flag-5'>詳解</b>

    Linux系統(tǒng)進(jìn)程管理入門(mén)指南

    Linux 系統(tǒng)中,進(jìn)程是正在運(yùn)行的程序的實(shí)例。理解進(jìn)程的管理、查看和控制對(duì)于系統(tǒng)管理員和開(kāi)發(fā)者來(lái)說(shuō)非常重要
    的頭像 發(fā)表于 04-22 14:34 ?784次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>進(jìn)程</b>管理入門(mén)指南

    Linux進(jìn)程狀態(tài)詳解

    進(jìn)程狀態(tài)是task_struct內(nèi)的一個(gè)整數(shù);進(jìn)行:進(jìn)程在調(diào)度隊(duì)列中,進(jìn)程的狀態(tài)都是running,阻塞:等待某種設(shè)備或者資源就緒。進(jìn)程是一個(gè)隊(duì)列,設(shè)備也是一個(gè)隊(duì)列,當(dāng)我們讀磁盤(pán),讀網(wǎng)
    的頭像 發(fā)表于 04-01 09:46 ?752次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>狀態(tài)<b class='flag-5'>詳解</b>

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個(gè)關(guān)鍵特性,通過(guò)該函數(shù),用戶(hù)可以增強(qiáng)對(duì)任務(wù)管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?754次閱讀

    智慧路燈如何實(shí)現(xiàn)遠(yuǎn)程控制

    引言 在智慧城市建設(shè)的進(jìn)程中,叁仟智慧路燈作為重要的基礎(chǔ)設(shè)施,其遠(yuǎn)程控制功能發(fā)揮著關(guān)鍵作用。遠(yuǎn)程控制使得叁仟智慧路燈能夠擺脫地域限制,實(shí)現(xiàn)高效、精準(zhǔn)的管理,極大地提升了城市照明系統(tǒng)的運(yùn)行效率與智能化
    的頭像 發(fā)表于 03-18 12:27 ?588次閱讀
    智慧路燈如何實(shí)現(xiàn)遠(yuǎn)<b class='flag-5'>程控制</b>?

    PID控制詳解(可下載)

    一、PID控制簡(jiǎn)介 PID( Proportional Integral Derivative)控制是最早發(fā)展起來(lái)的控制策略之一,由于其算法簡(jiǎn)單、魯棒 性好和可靠性高,被廣泛應(yīng)用
    發(fā)表于 02-27 15:42 ?3次下載

    plc遠(yuǎn)程控制模塊是什么

    PLC遠(yuǎn)程控制模塊是什么?PLC(ProgrammableLogicController,可編程邏輯控制器)遠(yuǎn)程控制模塊是用于實(shí)現(xiàn)遠(yuǎn)程監(jiān)控和控制PLC系統(tǒng)的設(shè)備,也可以被視作PLC網(wǎng)關(guān)
    的頭像 發(fā)表于 02-12 17:20 ?1337次閱讀

    Linux計(jì)劃任務(wù)cron詳解

    cron是linux下用來(lái)周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個(gè)守護(hù)進(jìn)程,與windows下的計(jì)劃任務(wù)類(lèi)似,當(dāng)安裝完成操作系統(tǒng)后,默認(rèn)會(huì)安裝此服務(wù) 工具,并且會(huì)自動(dòng)啟動(dòng)crond進(jìn)程,crond
    的頭像 發(fā)表于 02-07 15:31 ?1457次閱讀
    <b class='flag-5'>Linux</b>計(jì)劃任務(wù)cron<b class='flag-5'>詳解</b>

    PLC可編程控制器的簡(jiǎn)介

    第一臺(tái)可編程控制器(PDP一14),在通用汽車(chē)公司的生產(chǎn)線(xiàn)上試用后,效果顯著;1971年,日本研制出第一臺(tái)可編程控制器;1973年,德國(guó)研制出第一臺(tái)可編程控制器;而在我國(guó)于1974年研制可編
    的頭像 發(fā)表于 12-23 09:09 ?1871次閱讀

    深入解析Linux程序與進(jìn)程

    關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。作為系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。 程序與進(jìn)程的關(guān)系 進(jìn)程的狀態(tài) 基礎(chǔ)進(jìn)程狀態(tài) 創(chuàng)建狀態(tài):進(jìn)程在創(chuàng)建時(shí)需要申請(qǐng)一個(gè)空白PCB(
    的頭像 發(fā)表于 12-18 11:01 ?783次閱讀
    深入解析<b class='flag-5'>Linux</b>程序與<b class='flag-5'>進(jìn)程</b>

    Linux從零到精通:最簡(jiǎn)單的Shell腳本入門(mén)教程

    通過(guò)簡(jiǎn)單的命令和腳本,實(shí)現(xiàn)對(duì)系統(tǒng)的靈活控制和自動(dòng)化管理。 shell腳本前言 shell腳本入門(mén) shell變量基礎(chǔ) shell變量子串 shell數(shù)值運(yùn)算 條件表達(dá)式 流程控制語(yǔ)句 shell函數(shù)
    的頭像 發(fā)表于 12-05 09:56 ?2209次閱讀
    <b class='flag-5'>Linux</b>從零到精通:最簡(jiǎn)單的Shell腳本入門(mén)教程

    深入Linux進(jìn)程管理:提升效率與穩(wěn)定性的關(guān)鍵方法

    目錄 Linux進(jìn)程管理 8.1 IO負(fù)載 8.2 實(shí)時(shí)進(jìn)程監(jiān)控 5.1 作業(yè)與會(huì)話(huà) 5.2 作業(yè)分類(lèi) 4.1 ps 4.2pstree 4.3pgrep 4.4pidof 4.5 vmstat
    的頭像 發(fā)表于 11-22 11:05 ?1015次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>管理:提升效率與穩(wěn)定性的關(guān)鍵方法