作者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