新聞中心
在Linux中,進程是任何操作系統(tǒng)的核心組成部分之一。進程是指正在系統(tǒng)中運行的程序?qū)嵗?。在Linux中,每個進程都有一個獨特的名稱,這個名稱是由操作系統(tǒng)自動生成的,根據(jù)進程所執(zhí)行的任務(wù)和對系統(tǒng)的貢獻來賦予不同的名字。

十多年的績溪網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整績溪建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)建站從事“績溪網(wǎng)站設(shè)計”,“績溪網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
本文將深入探討Linux進程名字的含義,并從多個角度解析不同進程名字的含義。
1. init進程
在Linux系統(tǒng)中,之一個進程是init(初始化)進程。init進程的作用是為系統(tǒng)內(nèi)的所有其他進程創(chuàng)建一個啟動環(huán)境。因此,init進程是Linux系統(tǒng)中最重要的進程之一。
init進程所占用的進程ID(PID)為1,它的進程名字為“init”。它是由內(nèi)核自動啟動的,是所有其他進程的祖先進程。init進程在啟動時會自動啟動一些其它的進程,并創(chuàng)建它們所需要的環(huán)境。通常情況下,init進程會在系統(tǒng)啟動過程中啟動一些守護進程,如sshd、cron等等。
2. kthreadd進程
實際上,Linux中的所有進程都有一個共同祖先,那就是kthreadd(內(nèi)核線程)。kthreadd進程的作用是為其他線程創(chuàng)建和管理內(nèi)核線程。它是內(nèi)核線程在Linux系統(tǒng)中的管理者。
kthreadd進程所占用的PID為2,它的進程名字為“kthreadd”。它在系統(tǒng)啟動時自動初始化,其任務(wù)是在系統(tǒng)啟動時創(chuàng)建其他內(nèi)核線程并管理它們的生命周期。
3. systemd進程
systemd進程是Linux下最新的管理進程。systemd是未來趨勢,它支持多種服務(wù),如網(wǎng)絡(luò)、文件系統(tǒng)、日志等。它的設(shè)計目標是提供統(tǒng)一的啟動、管理和監(jiān)視機制,以便簡化系統(tǒng)管理和協(xié)調(diào)。
systemd進程所占用的PID為1,它的進程名字為“systemd”。在現(xiàn)代的Linux系統(tǒng)中,systemd進程已經(jīng)取代了init作為進程的初始父進程。
4. httpd進程
httpd進程是Apache Web服務(wù)器的核心進程,其作用是監(jiān)聽客戶端請求并將請求映射到正確的Web應(yīng)用程序。
httpd進程所占用的PID為一定的隨機數(shù),其進程名字通常是“httpd”或“apache2”。httpd進程通常在Web服務(wù)器的配置文件中指定。
5. sshd進程
sshd(Secure Shell daemon)進程是一個守護進程(Daemon),它允許用戶通過SSH協(xié)議登錄到遠程主機。它的改進版OpenSSH已經(jīng)成為Unix和Linux系統(tǒng)上更流行的安全遠程連接工具。
sshd進程所占用的PID為一定的隨機數(shù),其進程名字通常是“sshd”。該進程通常在運行時通過/etc/ssh/sshd_config文件進行配置。
6. crond進程
crond(定時調(diào)度程序)是一個守護進程,用于在特定時間執(zhí)行預(yù)定的任務(wù)。在Linux中,它是用戶管理過程的重要部分。
crond進程所占用的PID為一定的隨機數(shù),其進程名字通常是“crond”。該進程通常通過/etc/crontab文件進行配置。
本文詳細解析了Linux進程的一些重要名字及其含義。必須承認,在Linux系統(tǒng)的世界里,進程是不可或缺的元素,是系統(tǒng)運行的基石。通過此篇文章,不僅深入理解Linux進程名字的含義,也更深入地理解了Linux系統(tǒng)的基本工作原理。
相關(guān)問題拓展閱讀:
- Linux下進程查看 字符含義
- 如何修改 Linux 中的進程名
Linux下進程查看 字符含義
下面的解釋中如果有什么術(shù)語不明白了話,自己根據(jù)對應(yīng)英文關(guān)鍵字去搜索詳細說明,這些術(shù)語都是 linux/unix 操作系統(tǒng)中廣泛使用的
F: 標志位 (flags), 具體有哪些值及其含義可以參考 man ps 里面關(guān)于帶搭森 flags 的相關(guān)內(nèi)容
S: 狀態(tài) (state), 下面那幾個進程的狀態(tài)為S表示是在 sleeping 狀態(tài)(即等待狀態(tài))
PID: 當前進程號
PPID: 當前進程的父進程號
C: CPU 占用百蠢畝分率
PRI: 進程調(diào)度優(yōu)先級
NI: Nice 值
ADDR: 交枝裂換(swap) 地址
SZ: 虛擬內(nèi)存大小 (virtual size)
WCHAN: 當前進程正在等待的事件(比如等待semphore,等待 IO 等)
STIME: 進程啟動時間 (什么時候開始運行的)
TIME: 進程占用cpu時間
TTY: 進程對應(yīng)控制終端 (可以沒有)
CMD: 進程對應(yīng)的命令行參數(shù)
如何修改 Linux 中的進程名
在編寫網(wǎng)絡(luò)服務(wù)器程序時,為了響應(yīng)客戶端的請求,我們經(jīng)常需要新建進程來處理業(yè)務(wù)流程;而且又是為了關(guān)閉某個非法請求或者關(guān)閉長連接的客戶端,這時就需要殺死進程 killall proc_name。升孫 但是在新建進程時,子進程名與父進程名相同。因此需要由進程名及參數(shù)來區(qū)分客戶端連接。
在linux中prctl可以滿足這個要求,下滿是man手冊:
PR_SET_NAME (since Linux 2.6.9)
Set the process name for the calling process, using the value in
the location pointed to by (char *) arg2. The name can be up to
16 bytes long, and should be null terminated if it contains
fewer bytes.
但是prctl修改的進程名,只能是16個字節(jié)(包括皮鏈’\0′)。下面是修改的代碼(changetitle.c):
#include
#include
int main(int argc, char *argv, char *envp)
{
char *new_name = “abcdefghijklmnopqrstuvwxyz”;
getchar();
prctl(PR_SET_NAME, new_name);
getchar();
return 0;
}
當新名稱長度大于16時就會截斷,上面的新名字截斷后是abcdefghijklmno。這對于我們來說是有缺陷的。而且通過ps -aux 查看,進程名稱并沒有改變,改變的只是/prco/$(PID)/stat和
/prco/$(PID)/status的值,而/prco/$(PID)/cmdline并沒有改變。這種方式使用起來也是不方便的。
下面介紹另一種方式,可以與上面的方式互補。
首先看一下main函數(shù)的原型:int main(int argc, char *argv);
argv存放的是終端執(zhí)行的程序名稱也就是進程名。argv存放的是命令行參數(shù)。
linux中main()還有一個隱藏參數(shù)就是環(huán)境變量信息,存放了運行時所需要的環(huán)境變量。
我們可以通過以下來訪問這個變量
extern char **environ;
argv與environ是連續(xù)存放在棧區(qū)的。下面吵握鏈代碼可以查看參數(shù)信息:
#include
#include
extern char **environ;
int main(int argc , char *argv)
{
int i;
printf(“argc:%d\n” , argc);
for (i = 0; i
#include
#include
#include
#include
#include
# define MAXLINE 2023
extern char **environ;
static char **g_main_Argv = NULL; /* pointer to argument vector */
static char *g_main_LastArgv = NULL; /* end of argv */
void setproctitle_init(int argc, char **argv, char **envp)
{
int i;
for (i = 0; envp != NULL; i++) // calc envp num
continue;
environ = (char **) malloc(sizeof (char *) * (i + 1)); // malloc envp pointer
for (i = 0; envp != NULL; i++)
{
environ = malloc(sizeof(char) * strlen(envp));
strcpy(environ, envp);
}
environ = NULL;
g_main_Argv = argv;
if (i > 0)
g_main_LastArgv = envp + strlen(envp);
else
g_main_LastArgv = argv + strlen(argv);
}
void setproctitle(const char *fmt, …)
{
char *p;
int i;
char buf;
extern char **g_main_Argv;
extern char *g_main_LastArgv;
va_list ap;
p = buf;
va_start(ap, fmt);
vsprintf(p, fmt, ap);
va_end(ap);
i = strlen(buf);
if (i > g_main_LastArgv – g_main_Argv – 2)
{
i = g_main_LastArgv – g_main_Argv – 2;
buf = ‘\0’;
}
(void) strcpy(g_main_Argv, buf);
p = &g_main_Argv;
while (p
*p++ = ‘\0’;
g_main_Argv = NULL;
prctl(PR_SET_NAME,buf);
}
int main(int argc, char *argv)
{
char argv_buf = {0}; // save argv paramters
for(int i = 1; i
{
strcat(argv_buf, argv);
strcat(argv_buf, ” “);
}
setproctitle_init(argc, argv, environ);
setproctitle(“%s@%s %s”, “new_name”, “ip”, argv_buf);
for (int i = 0; environ != NULL; i++)
free(environ);
getchar();
return 0;
}
上面的代碼使用了prctl和修改argv兩種修改方法的結(jié)合,通過ps -a 、 ps -ef 、ps -aux、 top 等等命令都只能查詢到新進程名,/proc/$PID/ 下的文件也顯示了新進程名的信息。
應(yīng)用場景:
、標識父子進程名稱,防止被誤殺
關(guān)于linux 進程名字是什么意思的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都服務(wù)器租用選創(chuàng)新互聯(lián),先試用再開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。物理服務(wù)器托管租用:四川成都、綿陽、重慶、貴陽機房服務(wù)器托管租用。
當前題目:Linux進程名字的含義詳解 (linux 進程名字是什么意思)
地址分享:http://fisionsoft.com.cn/article/cccssjd.html


咨詢
建站咨詢
