學習epoll使用的過程中,了解到epoll_data中有乙個指標ptr可供自定義使用,結構定義如下:
typedef union epoll_data
epoll_data_t;
epoll_event結構體定義如下:
struct epoll_event
__epoll_packed;
於是我做了如下操作:
struct myevent_s ;
struct epoll_event ev = ;
struct epoll *evptr;
ev.events = epollin; //監聽定時器讀事件,當定時器超時時,定時器描述符可讀。
ev.data.fd = efd;//efd是我建立的乙個物件識別符號
ev.data.ptr=&g_event;
//....
//....epoll操作,此處略去
ret = read(evptr->data.fd, &value, sizeof(uint64_t));
然而總是報錯,read返回-1。單步除錯後發現在給ev.data.***賦值時,之前賦的值總會變化。仔細看了定義後才看到,data是個union, 不是struct。union是各項共用一段記憶體,所以後面改動了前面也會跟著改動了。
附上我的測試**:
#include #include #include #include #include #include #include#include #define time_max 2
//#define printf(fmt, arg...) printf(""fmt, ##arg)
struct myevent_s ;
//然後在epoll_wait()的第二個引數中的data.ptr會原封不動的把上邊的g_event返回給我們,所以我們可以利用這個ptr傳參。
int main() ;
struct epoll_event *evptr;
struct itimerspec time_intv; //用來儲存時間
tfd = timerfd_create(clock_monotonic, 0); //建立定時器
if(tfd == -1)
time_intv.it_value.tv_sec = time_max; //設定2s超時
time_intv.it_value.tv_nsec = 0;
time_intv.it_interval.tv_sec = time_intv.it_value.tv_sec; //每隔2s超時
time_intv.it_interval.tv_nsec = time_intv.it_value.tv_nsec;
printf("timer start ...\n");
timerfd_settime(tfd, 0, &time_intv, null);//啟動定時器
efd = epoll_create1(0); //建立epoll例項
if (efd == -1)
evptr = (struct epoll_event *)calloc(1, sizeof(struct epoll_event));
if (evptr == null)
struct myevent_s g_event;
sprintf(g_event.buf, "hello world", 8);
g_event.fd = tfd;
ev.events = epollin; //監聽定時器讀事件,當定時器超時時,定時器描述符可讀。
ev.data.ptr=&g_event;
epoll_ctl(efd, epoll_ctl_add, tfd, &ev); //新增到epoll監聽佇列中
while(1)
}return 0;
}
結構體問題
1.首先構建乙個結構體 typedef struct num 2.然後使用該結構體進行定義 1.指標定義 num i num malloc sizeof num 5 if i exit 1 2.非指標定義 num j 5 3.我認為輸出的val值應該都為0,因為建立結構體時就給val賦值,但是結果卻...
結構體 結構體變數 結構體指標的基本問題
注意 以下都是32位的系統 一 結構體定義 第乙個問題 下面兩個 struct human struct human 這兩個結構體是否相同?答案 不一樣 原因 根據c語言結構體的機制,我們為結構體變數分配乙個連續空間時,總是以結構體中最大位元組長度型別的整數倍分配。第乙個的記憶體分布圖 length...
結構體對齊問題
1,比如 structa structb sizeof a 6,sizeof b 8,為什麼?注 sizeof short 2,sizeof long 4 因為 成員對齊有乙個重要的條件,即每個成員按自己的方式對齊.其對齊的規則是,每個成員按其型別的對齊引數 通常是這個型別的大小 和指定對齊引數 這...