[問題] poll()與select()的問題

看板C_and_CPP (C/C++)作者 (YA賈修動畫真好看)時間16年前 (2009/02/14 13:15), 編輯推噓1(104)
留言5則, 1人參與, 最新討論串1/1
我的程式碼大約如下 要詳細的話再跟我說 我再補上 我的問題是 1. 我在核心poll() 只有動到mask回傳值 mask回傳值回到select()時 是給ret來接 在AP層 只用ret來看是否為大於 小於或等於0 那為什麼不能直接把 mask |= POLLIN | POLLRDNORM; 這行改成 mask=1; 這樣就好了呢? (雖然這行改成mask=1也是可以正常工作) 但我不懂原本寫成那樣的用意 2. 核心只動到poll()裡的mask 那我AP層 FD_ISSET( fh, &readset )和FD_ISSET( STDIN_FILENO, &readset ) 是如何得知要做讀還是寫 這些參數又是誰去改呢? 我在AP層寫了一個select() 內容大概如下 int main(int argc , char *argv[]) { ... int fh, cnt=0, ret, ndevs; char bfr[64]; fd_set readset; printf("Poll the uart driver and stdin \n"); printf("Press Ctrl C to exit\n"); fh = open("/dev/uart", O_RDWR); if ( fh == -1 ) { printf("open /dev/uart fail\n"); exit(0); } while(1) { FD_ZERO( &readset ); FD_SET( fh, &readset ); FD_SET( STDIN_FILENO, &readset ); ndevs = 1+fh; ret = select( ndevs, &readset, NULL, NULL, NULL ); if ( ret <= 0 ) { printf( "Error occured!\n"); break; } else { if ( FD_ISSET( fh, &readset ) ) { memset(bfr, 0, sizeof(bfr)); cnt = read(fh, bfr, sizeof(bfr)); printf("read %d characters: %s\n", cnt, bfr); } else if ( FD_ISSET( STDIN_FILENO, &readset ) ) { scanf ("%s",bfr); write(fh, bfr, strlen(bfr)+1); } } } close(fh); return 0; } 我在核心也寫了一個poll() 內容大概如下 #include<linux/poll.h> unsigned int uart_poll (struct file *filp, struct poll_table_struct *pwait) { unsigned int mask=0; // To do: poll_wait() poll_wait(filp , &wq, pwait); // To do: Check if status has been changed and return a bitmap if (bSleep) { mask |= POLLIN | POLLRDNORM; bSleep=0; } return mask; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.28.70

06/05 18:06, , 1F
第一個原因是你設計的 device driver 是要給別人用的
06/05 18:06, 1F

06/05 18:06, , 2F
當然要設計一些規範讓大家有遵循
06/05 18:06, 2F

06/05 18:07, , 3F
簡單來說 你寫 1 你拿到別台電腦給人 run 誰看的懂你寫啥
06/05 18:07, 3F

06/05 18:08, , 4F
第二個是在你 user space 中你呼叫的 context 中的某一層
06/05 18:08, 4F

06/05 18:08, , 5F
改的
06/05 18:08, 5F
文章代碼(AID): #19bbDVF4 (C_and_CPP)
文章代碼(AID): #19bbDVF4 (C_and_CPP)