[問題] poll()與select()的問題
我的程式碼大約如下
要詳細的話再跟我說 我再補上
我的問題是
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
06/05 18:06, 1F
→
06/05 18:06, , 2F
06/05 18:06, 2F
→
06/05 18:07, , 3F
06/05 18:07, 3F
→
06/05 18:08, , 4F
06/05 18:08, 4F
→
06/05 18:08, , 5F
06/05 18:08, 5F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章