epoll data 結構體問題

2021-09-24 23:31:39 字數 1967 閱讀 1587

學習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 因為 成員對齊有乙個重要的條件,即每個成員按自己的方式對齊.其對齊的規則是,每個成員按其型別的對齊引數 通常是這個型別的大小 和指定對齊引數 這...