Linux管道函式使用

2021-06-08 08:30:25 字數 1767 閱讀 7763

背景:專案有個功能是檢視版本號(像什麼核心版本號、驅動版本號,等等),是通過管道來實現的,網上也有這方面的介紹,就不多說了。

在一次測試過程中,發現不斷檢視版本號竟然會導致系統復位(比如檢視20次、40次、100次),這個bug發現晚的原因是沒有誰那麼無聊連續檢視100次版本號,當然,發現也是碰巧在幾次檢視之後系統就掛了。後來發現是因為某個地方卡住導致某個執行緒超時而復位。後來跟蹤到了這個管道函式中來。解決的方法是使用讀取檔案的方法來獲取系統版本號(如核心版本)。不過真正原因還沒有找到,可能出在popen這類函式中。

下面給出示例**:

#include

.h>

#include

.h>

#include

.h>

#include

.h>

#include

.h>

static

void onsignal(

int signalno)

} if (bexit)

} // 通過管道讀取執行命令後的資訊

void getsystemcmdinfo(

const

char* cmd, 

char* buf, 

int len) ;

file* fp = popen(cmd, 

"r");

if (fp)

pclose(fp); }

}// 通過檔案讀取到資訊

// 這種方法是讀檔案,上面的方法是執行命令,兩者不是一回事

void readkernelversion(

char* file, 

char* buf, 

int len) ;

fp = fopen(file, 

"r");

if (fp == null)

fread(info, 

1, sizeof(info), fp);

if ( buf != null && len > (

int)strlen(info) )

fclose(fp); }

int main(

void) ;

char buf[

1024] = ;

int ilen = 

0; for (

int i = 

0; i < 

255; i++)

} // 執行此函式時,會有sigchld訊號

getsystemcmdinfo(

"cat /proc/version", szvalue, 

sizeof(szvalue));

//readkernelversion("/proc/version", szvalue, sizeof(szvalue));

ilen = sprintf(buf, 

"[kernel ver]: %s\r\n", szvalue);

printf(

"%s", buf);

return0;

} popen算是重型**了,一般的小場合可不必使用,像檢視核心版本,可能使用cat /proc/version命令,也可以讀取/proc/version檔案。

還是那名話說得好,具體情況具體分析,因地制宜採用不同的策略方能制勝。

語法高亮由

遲思堂工作室

強力支援

宣告:本文僅為學習之目的,**僅是示例性**,網路上也能找到類似用法,無意亦無膽涉及過多其它**。

李遲 **隨筆 即日

linux管道的使用

1.新建乙個檔案 touch a.txt b.txt 2.錯誤重定向 2 find etc name zhaoxing.txt 2 error.txt 3.將正確或錯誤的資訊都輸入到log.txt中 find etc name passwd tmp log.txt 2 1 find etc name...

管道 mkfifio函式的使用

mkfifo命令生成管道檔案 mkfifo函式 第一引數路徑,第二是許可權 int mkfifo const char pathname,mode t mode include include include include include include include include intma...

Linux管道pipe使用例項

函式 include int pipe int filedes 2 描述pipe 函式建立乙個管道和指向該管道的一對檔案描述符,並且將檔案描述符儲存到檔案描述符陣列filedes中。其中filedes 0 為讀端,filedes 1 為寫端。返回值0 管道建立成功 1 管道建立失敗,同時errno置...