新聞中心
在Linux系統(tǒng)中,后臺(tái)運(yùn)行程序是一種非常常見(jiàn)的操作。這種操作可以使程序在后臺(tái)默默地運(yùn)行,而不會(huì)打擾到用戶(hù)的當(dāng)前工作。也就是說(shuō),無(wú)論何時(shí)用戶(hù)需要該程序,只需要調(diào)用運(yùn)行該程序的命令即可。在本文中,我們將介紹如何在Linux系統(tǒng)中讓C程序以后臺(tái)運(yùn)行的方法,以及如何利用Linux系統(tǒng)提供的一些機(jī)制來(lái)維護(hù)運(yùn)行在后臺(tái)的程序。

10年積累的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有新晃免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
1. Linux后臺(tái)運(yùn)行環(huán)境
在Linux系統(tǒng)中,所有進(jìn)程都是由其他進(jìn)程 fork() 出來(lái)的。在Linux系統(tǒng)的基本架構(gòu)中,每個(gè)進(jìn)程都有一個(gè)父進(jìn)程,但同時(shí)也可以有多個(gè)子進(jìn)程。當(dāng)一個(gè)進(jìn)程 fork() ,它會(huì)復(fù)制一份與父進(jìn)程相同的代碼和數(shù)據(jù),但是這個(gè)新的進(jìn)程會(huì)擁有自己的進(jìn)程ID(pid)。根據(jù)進(jìn)程的不同性質(zhì),可以將進(jìn)程分為前臺(tái)進(jìn)程和后臺(tái)進(jìn)程。前臺(tái)進(jìn)程是與用戶(hù)交互的進(jìn)程,而后臺(tái)進(jìn)程是在后臺(tái)運(yùn)行的進(jìn)程,不與用戶(hù)進(jìn)行交互。
Linux環(huán)境下后臺(tái)運(yùn)行的程序一般使用守護(hù)進(jìn)程來(lái)實(shí)現(xiàn)。守護(hù)進(jìn)程是指在后臺(tái)運(yùn)行的沒(méi)有控制終端的進(jìn)程。通過(guò)守護(hù)進(jìn)程,我們可以實(shí)現(xiàn)程序的后臺(tái)運(yùn)行。守護(hù)進(jìn)程的實(shí)現(xiàn)需要先將運(yùn)行目錄切換到根目錄,然后調(diào)用 umask() 設(shè)置文件掩碼,防止寫(xiě)的日志文件權(quán)限為所有用戶(hù)可讀寫(xiě)。
2. 守護(hù)進(jìn)程實(shí)現(xiàn)
在Linux環(huán)境下,一個(gè)典型的守護(hù)進(jìn)程通常由以下這些步驟組成:
① fork()一個(gè)新進(jìn)程,然后父進(jìn)程退出,并使新建的子進(jìn)程稱(chēng)為新的會(huì)話(huà)的首進(jìn)程。
② 在新會(huì)話(huà)中創(chuàng)建一個(gè)新文件夾,并使其成為當(dāng)前工作目錄。
③ 關(guān)閉所有的文件描述符。(0, 1, 2除外)
④ 讓標(biāo)準(zhǔn)輸入,輸出和標(biāo)準(zhǔn)錯(cuò)誤文件描述符指向/dev/null。
⑤ 在守護(hù)進(jìn)程開(kāi)始運(yùn)行之前,通過(guò)調(diào)用 umask() 來(lái)設(shè)置文件創(chuàng)建掩碼。
下面是一個(gè)示例程序:
“`c
int mn(int argc, char *argv[])
{
pid_t pid = 0;
int fd, i;
pid = fork();
if (pid == -1)
{
printf(“Fled to fork.\n”);
exit(1);
}
if (pid > 0)
{
printf(“Parent process exit.\n”);
exit(0);
}
setsid();
umask(0);
if (chdir(“/”)
{
printf(“Fled to change working directory.\n”);
exit(1);
}
fd = open(“/dev/null”, O_RDWR, 0);
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
close(fd);
while(1) { sleep(60); }
return 0;
}
“`
在這個(gè)程序中,我們先使用 fork() 創(chuàng)建一個(gè)新進(jìn)程。如果創(chuàng)建的新進(jìn)程為0,則為子進(jìn)程,繼續(xù)對(duì)它進(jìn)行處理。子進(jìn)程先調(diào)用 setsid() 方法,使其成為一個(gè)新的會(huì)話(huà)(這就是使進(jìn)程成為守護(hù)進(jìn)程的之一步)。接著,我們調(diào)用 umask() 來(lái)設(shè)置權(quán)限掩碼,防止文件被惡意創(chuàng)建者讀取或破壞。然后使用 chdir() 來(lái)把工作目錄切換到根目錄。關(guān)閉所有權(quán)限大于 2 的文件描述符(即 stdin, stdout 和 stderr),并將它們的文件描述符重新指向 /dev/null。在最后一個(gè)步驟完成之后,我們可以自由地在后臺(tái)運(yùn)行程序了。
3. 如何在Linux系統(tǒng)中查看后臺(tái)進(jìn)程
在Linux系統(tǒng)中,我們可以通過(guò)命令 ps -ef 來(lái)查看所有正在運(yùn)行的進(jìn)程列表。但有時(shí),這些列表中包含的信息可能會(huì)讓人感到困惑。因此,我們可以通過(guò) grep 命令來(lái)篩選我們需要查找的進(jìn)程。例如,如果我們要查找進(jìn)程名為 “my_app” 的所有進(jìn)程,則可以使用以下命令:
“`bash
$ ps -ef | grep my_app
“`
在執(zhí)行這個(gè)命令之后,系統(tǒng)會(huì)返回匹配的所有進(jìn)程。其中,之一列是進(jìn)程ID,第二列是該進(jìn)程的所屬用戶(hù),第三列是該進(jìn)程的狀態(tài),以及后續(xù)列則是進(jìn)程的完整路徑。
4. 如何結(jié)束一個(gè)后臺(tái)進(jìn)程
有時(shí),我們需要結(jié)束一個(gè)運(yùn)行在后臺(tái)的進(jìn)程,以便我們重新啟動(dòng)或更改其配置文件。在Linux系統(tǒng)中,我們可以通過(guò) kill 命令來(lái)結(jié)束一個(gè)進(jìn)程。這個(gè)命令的語(yǔ)法如下:
“`bash
$ kill
“`
其中, 就是我們要結(jié)束的進(jìn)程ID。在發(fā)送 kill 命令后,進(jìn)程就會(huì)被結(jié)束。如果該進(jìn)程無(wú)法正常結(jié)束,我們可以使用 kill -9 命令來(lái)強(qiáng)制結(jié)束進(jìn)程。此命令不會(huì)發(fā)送任何信號(hào)給進(jìn)程,而是直接強(qiáng)制結(jié)束該進(jìn)程。
相關(guān)問(wèn)題拓展閱讀:
- 怎么用Linux運(yùn)行C程序?
怎么用Linux運(yùn)行C程序?
不一定非要用vi 編輯器 那個(gè)很不方便(個(gè)人觀點(diǎn)) 可以使用gedit geany emacs 等等
比如編寫(xiě)棗則亮好了一個(gè)文件test.c 使用gcc /g++ -o test test.c進(jìn)行編譯 有很多凳寬盯物編譯選項(xiàng)你自己看著加 編譯完成后執(zhí)行 ./test 就可以運(yùn)行了
關(guān)于linux c 后臺(tái)運(yùn)行的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站營(yíng)銷(xiāo)推廣找創(chuàng)新互聯(lián),全國(guó)分站站群網(wǎng)站搭建更好做SEO營(yíng)銷(xiāo)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)四川成都IDC基礎(chǔ)服務(wù)商,價(jià)格厚道。提供成都服務(wù)器托管租用、綿陽(yáng)服務(wù)器租用托管、重慶服務(wù)器托管租用、貴陽(yáng)服務(wù)器機(jī)房服務(wù)器托管租用。
分享名稱(chēng):Linux C程序后臺(tái)運(yùn)行實(shí)現(xiàn)方法大揭秘 (linux c 后臺(tái)運(yùn)行)
文章來(lái)源:http://m.fisionsoft.com.cn/article/cdpodjh.html


咨詢(xún)
建站咨詢(xún)
