如題,我在執行緒中使用FD_SET了,程式還是卡在select這里。請教各位大神!代碼如下。
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h> // mkfifo
#include <sys/stat.h> // mkfifo
#include <pthread.h>
#define MAX_BUFFER_SIZE 1024 /* 緩沖區大小*/
#define IN_FILES 2 /* 多路復用輸入檔案數目*/
#define MAX(a, b) ((a > b)?(a)b))
int fds[IN_FILES] = {1,2};
fd_set inset;
void *testfunc(void *arg)
{
int i;
sleep(1);
for (i = 0; i < IN_FILES; i++)
{
FD_SET(fds, &inset);
}
}
int main(void)
{
char buf[MAX_BUFFER_SIZE];
int i, res, maxfd;
pthread_t _mthread;
struct timeval tv;
FD_ZERO(&inset);
if (pthread_create(&_mthread, NULL, (void *)testfunc, NULL) != 0)
{
fprintf(stderr, "thread create failed\n");
return -1;
}
/*取出兩個檔案描述符中的較大者*/
maxfd = MAX(fds[0], fds[1]);
res = select(maxfd + 1, &inset, NULL, NULL, NULL);
for (i = 0; i < IN_FILES; i++)
{
if(FD_ISSET(fds, &inset))
printf("Select ok\n");
}
return 0;
}
uj5u.com熱心網友回復:
阻塞在select, 說明你的fd 沒有IO讀事件發生。至于你的fd 為啥沒有IO事件,以個是client沒有發過來資料,在一個就是你的程式有問題,
從你貼的這一段代碼, 你的fd都沒有創建。如果使用的是socket的話,總得把socket創建出來,再添加到fdset里面
uj5u.com熱心網友回復:
tv 都不用,就會 一直等,直到標準輸入輸出有資料。uj5u.com熱心網友回復:
select函式傳參監聽的檔案描述符不對,沒有設定超時。uj5u.com熱心網友回復:
for (i = 0; i < IN_FILES; i++){
FD_SET(fds, &inset); /// 這里寫的有問題。 第一個引數是fd,你的是陣列。 要改為 FD_SET(fds[i], &inset);
}
再一個,你監聽了 fd=1,2兩個fd。 也就是標準輸出(printf,或 cout)及錯誤輸出 (fprintf(stderr..) 或 cerr)。
如果沒有列印輸出,select也是不會回傳的
uj5u.com熱心網友回復:
在4樓的改正基礎上select 第二個引數是 監聽讀事件的描述符集合 第三個引數是 監聽寫事件描述符集合;
你這兩個描述符 是 1 標準輸出 2 標準錯誤;
也許你寫成
res = select(maxfd + 1, NULL, &inset, NULL, NULL);
就能觸發了;
因為我理解這個 監聽寫事件 是表示 內核寫緩沖區現在可寫 的時候通知,現在應該可寫
監聽讀事件 是表示 內核讀緩沖區 有資料可讀, 現在沒資料輸入 ,應該不可讀,
uj5u.com熱心網友回復:
有個很明顯的問題,你創建這個執行緒的時候,在執行緒還沒運行完,就已經select了,pthread_create可不是運行完執行緒才往下走的,更過分的是執行緒內部還睡了一秒,更不可能等到了轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/34459.html
標籤:應用程序開發區
上一篇:如何檢測未知設備的IP地址
