[問題] 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數位生活區 即時熱門文章