作者rruy (YA賈修動畫真好看)
看板C_and_CPP
標題[問題] poll()與select()的問題
時間Sat Feb 14 13:15:09 2009
我的程式碼大約如下
要詳細的話再跟我說 我再補上
我的問題是
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
1F:推 JusTKurO:第一個原因是你設計的 device driver 是要給別人用的 06/05 18:06
2F:→ JusTKurO:當然要設計一些規範讓大家有遵循 06/05 18:06
3F:→ JusTKurO:簡單來說 你寫 1 你拿到別台電腦給人 run 誰看的懂你寫啥 06/05 18:07
4F:→ JusTKurO:第二個是在你 user space 中你呼叫的 context 中的某一層 06/05 18:08
5F:→ JusTKurO:改的 06/05 18:08