天天看點

linux檢查程序是否正在正常運作

1、popen函數

 popen() 函數 用 建立管道 的 方式啟動一個 程序, 并調用 shell. 因為 管道是被定義成單向的, 是以 type 參數 隻能定義成 隻讀或者 隻寫, 不能是 兩者同時, 結果流也相應的 是隻讀 或者 隻寫.

command 參數 是 一個 字元串指針, 指向的是一個 以 null 結束符 結尾的字元串, 這個字元串包含 一個 shell 指令. 這個指令 被送到 /bin/sh 以 -c 參數 執行, 即由 shell 來執行. type 參數 也是 一個 指向 以 null 結束符結尾的 字元串的指針, 這個字元串 必須是 'r' 或者 'w’ 來指明 是 讀還是寫.

2、strsep函數

原型:char *strsep(char **stringp, const char *delim); 功能:分解字元串為一組字元串。從stringp指向的位置起向後掃描,遇到delim指向的字元串中的字元後,将此字元替換為NULL,傳回stringp指向的位址。它适用于分割“關鍵字”在兩個字元串之間隻“嚴格出現一次”的情況。

3、程式思路

是先用shell找出程序名,然後發信号0确認程序是否在正常運作, 代碼如下:

static int check_pid(const char *psAppName)

{

FILE *psFile = NULL; 

int iRet = FAIL;

char acCmd[128] = {0};

char acBuff[PID_INFO] = {0};

char *p = acBuff;

pid_t iWnePid = -1;

char *psStrtok = NULL;

memset(acCmd,0,sizeof(acCmd));

memset(acBuff,0,sizeof(acBuff));

snprintf(acCmd, sizeof(acCmd),"ps -ef|grep %s",psAppName);

debuging("acCmd = %s\n", acCmd);

psFile = popen(acCmd, "r");

if(NULL == psFile)

{

debuging("psFile == NULL\n");

return FAIL; 

}

if (NULL == fgets(acBuff, PID_INFO, psFile))

{

return FAIL;

}

debuging("acBuff = %s\n", acBuff);

if (strlen(acBuff) > 0)

{

while((psStrtok = strsep(&p, " ")))

{

//debuging("psStrtok = %s\n", psStrtok);

if(NULL == psStrtok)

if(0 == strlen(psStrtok))

return FAIL; 

}

else

{

debuging("psStrtok = %s\n", psStrtok);

if (strlen(psStrtok) > 0)

{

if(0 == (iWnePid = atoi(psStrtok)))

{

printf("GetPid Failed\n");

return FAIL; 

}

else

{

printf("iWnePid = %d\n", iWnePid);

break;

}

}

}

}

}

pclose(psFile); 

iRet = kill(iWnePid, 0);

debuging("iRet = %d\n", iRet);

if(0 == iRet)

{

iRet = WNET_EXIST;

printf("process: %s exist!\n",psAppName);

}

else 

{

memset(acCmd,0,sizeof(acCmd));

snprintf(acCmd, sizeof(acCmd), "kill -9 %d", iWnePid);

debuging("process: %s not exist!, acCmd = %s\n",psAppName, acCmd);

}

return iRet;

}