在Linux中,我使用「pidof process_name」命令打開管道,然後使用fgets函數讀取輸出,從而找到進程的pid。但它偶爾會發現一次失敗。以下是我的代碼,用於查找我的流程的pid。使用popen函數讀取命令輸出失敗
int FindPidByProcessName(char *pName)
{
int pid = -1;
char line[30] = { 0 };
char buf[64] = { 0 };
sprintf(buf, "pidof %s", pName);
//pipe stream to process
FILE *cmd = popen(buf, "r");
if (NULL != cmd)
{
//get line from pipe stream
fgets(line, 30, cmd);
//close pipe
pclose(cmd); cmd = NULL;
//convert string to unsigned LONG integer
pid = strtoul(line, NULL, 10);
}
return pid;
}
即使進程在「ps」命令輸出中可用,輸出中也有時會出現pid = 0。 所以,我試圖找到這個問題背後的根本原因,我發現像輸入/輸出緩衝機制可能在我的方案中創建問題。
所以我嘗試在打開popen()之前使用sync()函數,奇怪的是我的函數開始以100%的精度工作。
現在sync()函數花費太多時間(大約2分鐘)來完成它的執行,這是不可取的。所以我嘗試使用fflush(),fsync()和fdatasync(),但這些都不能正常工作。
所以請任何人告訴我這個問題背後的確切根源以及如何正確解決這個問題?
我不明白你的'while'循環 - 你只是調用'popen'一次,你爲什麼而循環讀取輸出? – Ariel
抱歉誤會,這只是我用來編寫函數的編碼格式。它在這裏沒有意義,因爲它是(0)。它不會被循環。 – ravibhuva9955
當'pid'爲'0'時,'line'的內容是什麼? – Ariel