網路斷線檢測中用到的popen
網路斷線檢測中用到的popen
[@more@]/**
* @fn netPing
* @brief 獲取Ping狀態
* @param[in]
* @param[out]
* @return 0: down, 1: up
*/
int netPing(void)
{
int i = 0;
int ret = APP_FAIL;
uint networkByteOrder;
char buf[MAX_CMD_LEN] = {0};
char strbuf[100] = {0};
FILE *fd = NULL;
networkByteOrder = htonl(pSetupSetPing->detectIpAddr);
sprintf(strbuf, "/usr/local/sbin/ping -c 4 -t 1 %s", inet_ntoa(*(struct in_addr*)(&networkByteOrder)));
for(i = 0; i < pSetupSetPing->retryTimes; i++)
{
fd = popen(strbuf, "r");
if (NULL == fd)
{
perror("popen");
dbgPrintfl(DETAIL, "popen ping fail!n");
ret = APP_FAIL;
goto out;
}
dataNoBlockFgets(buf, sizeof(buf), fd);
if(0 == strlen(buf)) //ping失敗
{
dbgPrintfl(DETAIL, "ping fail!n");
ret = APP_FAIL;
continue;
}
else
{
ret = APP_OK;
break;
}
}
out:
if(fd != NULL)
{
pclose(fd);
fd = NULL;
}
return ret;
}
/**
* @fn dataNoBlockFgets
* @brief 本地實現替換fgets的非阻塞版本
* @param[in] int size:待讀取長度
* FILE* stream:讀取的流
* @param[out] char* s:讀取輸出
* @return
*/
static char* dataNoBlockFgets(char *s, int size, FILE* stream)
{
int ret = 0;
int fno = -1;
fd_set rfds;
int maxFd;
struct timeval timeout;
fno = fileno(stream);
memset(s, 0, size);
do{
maxFd = 0;
FD_ZERO(&rfds);
FD_SET(fno, &rfds);
maxFd = maxFd > fno ? maxFd : fno;
maxFd += 1;
timeout.tv_sec = 2;
timeout.tv_usec = 0;
ret = select(maxFd, &rfds, NULL, NULL, &timeout);
if(ret > 0)
{
if(FD_ISSET(fno, &rfds))
{
read(fno, s, size);
}
}
}while(0);
dbgPrint(DETAIL, "%sn", s);
return s;
}
popen:
程式I/O函式,與pclose函式一起使用。
表標頭檔案
#include
函式定義
FILE * popen ( const char * command , const char * type );
int pclose ( FILE * stream );
函式說明
popen() 函式透過建立一個管道,呼叫 fork 產生一個子程式,執行一個 shell 以執行命令來開啟一個程式。這個程式必須由 pclose() 函式關閉,而不是 fclose() 函式。pclose() 函式關閉標準 I/O 流,等待命令執行結束,然後返回 shell 的終止狀態。如果 shell 不能被執行,則 pclose() 返回的終止狀態與 shell 已執行 exit 一樣。
type 引數只能是讀或者寫中的一種,得到的返回值(標準 I/O 流)也具有和 type 相應的只讀或只寫型別。如果 type 是 "r" 則檔案指標連線到 command 的標準輸出;如果 type 是 "w" 則檔案指標連線到 command 的標準輸入。
command 引數是一個指向以 NULL 結束的 shell 命令字串的指標。這行命令將被傳到 bin/sh 並使用-c 標誌,shell 將執行這個命令。
popen 的返回值是個標準 I/O 流,必須由 pclose 來終止。前面提到這個流是單向的。所以向這個流寫內容相當於寫入該命令的標準輸入;命令的標準輸出和呼叫 popen 的程式相同。與之相反的,從流中讀資料相當於讀取命令的標準輸出;命令的標準輸入和呼叫 popen 的程式相同。
返回值
如果呼叫 fork() 或 pipe() 失敗,或者不能分配記憶體將返回NULL,否則返回標準 I/O 流。
返回錯誤
popen 沒有為記憶體分配失敗設定 errno 值。
如果呼叫 fork() 或 pipe() 時出現錯誤,errno 被設為相應的錯誤型別。
如果 type 引數不合法,errno將返回EINVAL。
使用舉例
if((fp=popen("/usr/bin/uptime","r"))==NULL);
{
sprintf(buf,"error: %sn", strerror(errno));
....//異常處理
}
else
{
....
pclose(fp);
}
函式原型:int _fileno( FILE *stream );
函式功能:fileno()用來取得引數stream指定的檔案流所使用的檔案描述符
返回值:某個資料流的檔案控制程式碼
標頭檔案:stdio.h
例子:
int main(void)
{
FILE *fp;
int fd;
fp = fopen("/etc/passwd", "r");
fd = fileno(fp);
printf("fd = %dn", fd);
fclose(fp);
return 0;
}
#define fileno(__p) ((__p)->_file)
因為FILE 結構體定義為
類似
typedef struct {
unsigned char *_ptr;
int _cnt;
unsigned char *_base;
unsigned char *_bufendp;
short _flag;
short _file;
int __stdioid;
char *__newbase;
void *_lock;
} FILE;
其中 _file就是檔案描述符。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23168012/viewspace-1044778/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用netstat檢測及監測網路連線
- Android檢測網路狀態,判斷當前網路是否可用Android
- 關於檢測TCP連線斷開TCP
- 滲透&&探測 (如何斷開隔壁妹紙的無線網路)
- 判斷網路是否連線
- Laravel-Echo 線上離線檢測判斷Laravel
- 檢測網路狀態
- 檢查網路是否連線
- 網路連線斷開如何解決 win10系統網路連線經常斷開Win10
- JS 檢測網路頻寬JS
- 檢測網路狀態 - flutterFlutter
- iOS 檢測網路狀態iOS
- 網路佈線測試中的三個關鍵步驟
- 判斷是否能連線網際網路
- 深度學習技術在網路入侵檢測中的應用深度學習
- 網路安全中,計算機病毒檢測方法有哪些?計算機
- 網路狀態檢測的利器 - ss命令
- win10網路總是自動掉線斷網怎麼辦_win10網路自動掉線斷網的解決教程Win10
- 一次網路連線錯誤的診斷
- 無線網路異常的一次診斷
- python檢測網路延遲Python
- nodejs檢測因特網是否斷開方案NodeJS
- 測試中會用到的四款工具
- 俄羅斯成功斷開全球網際網路連線
- Kubernetes使用者指南(二)–部署組合型的應用、連線應用到網路中
- 檢視網路連線數netstat -an
- 檢視系統網路連線資訊
- 網際網路+檢驗檢測智慧化成發展趨勢
- UE4 中射線檢測的簡單探索
- 單向鏈路檢測模式消除交換機誤診斷模式
- 【CVPR2018】物體檢測中的結構推理網路
- 網路入侵檢測規避工具fragrouter
- 網際網路訪問檢測伺服器伺服器
- ss:檢視網路連線的另一種方法
- vmware虛擬機器網路中斷虛擬機
- 全志T3核心板在輸電線路影像檢測中的應用
- BSN Spartan網路公有鏈應用案例:全球診斷和基因檢測公司Prenetics
- ip代理-Golang協程批次檢測代理線路Golang