我使用aio_write發送了100個請求。我使用request.aio_sigevent.sigev_value.sival_ptr = some_address;將sigval(回呼引數)設定為某個地址。每個請求都有一個不同的地址。回呼應該將一些資料寫入該地址。
我希望回呼被呼叫100次,并使用我給它的100個不同的引數。相反,回呼被呼叫了100次,每次都是同一個引數:第100個請求的引數。我嘗試了SIGEV_THREAD和SIGEV_SIGNAL,結果都一樣。
我發送請求的代碼片段:
for (int i = 0; i < num_requests; i ) {
struct aiocb request = build_request(/* snip */, & array[i])。)
aio_write(&request)。
}
(其中build_request簡單地構造了一個struct aiocb并寫入了aio欄位,以及aio_sigevent欄位。sigev_notify, sigev_signo 或 sigev_notify_function, 和 sigev_value.sival_ptr。
為什么會發生這種情況?
uj5u.com熱心網友回復:
從aio_write手冊來看:
在寫操作的程序中,控制塊不能被改變。
在你的案例中,一旦每個回圈迭代結束,該變數就會超出范圍。因此,無論是從純C語言還是從被呼叫的API來看,這都是未定義行為。一個解決方案是創建一個aiocb的靜態或動態陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/306941.html
標籤:
