背景:專案有個功能是檢視版本號(像什麼核心版本號、驅動版本號,等等),是通過管道來實現的,網上也有這方面的介紹,就不多說了。
在一次測試過程中,發現不斷檢視版本號竟然會導致系統復位(比如檢視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置...