LinuxÉ豸Çý¶¯¿ª·¢Ïê½â ±Ê¼Ç9 Ò첽֪ͨÓëÒì²½I/O
Ò첽֪ͨ£ºÒ»µ©É豸¾ÍÐ÷£¬ÔòÖ÷¶¯Í¨ÖªÓ¦ÓóÌÐò£¬ÕâÑùÓ¦ÓóÌÐò¸ù±¾²»ÐèÒª²éѯÉ豸״̬£¬ÕâÒ»µã·Ç³£ÀàËÆÓÚÓ²¼þÉϵēÖжϔµÄ¸ÅÄ±È½Ï׼ȷµÄ³ÆÎ½ÊÇ“ÐźÅÇý¶¯µÄÒì²½I/O
//Æô¶¯ÐźÅÇý¶¯»úÖÆ
signal(SIGIO, input_handler);//ÈÃinput_handler()´¦ÀíSIGIOÐźÅ
fcntl(fd, F_SETOWN, getpid());//ÉèÖñ¾½ø³ÌΪSTDIN_FILENOÎļþµÄÓµÓÐÕߣ¬ÈÃÄÚºËÖªµÀ½«Ðźŷ¢¸ø±¾½ø³Ì
oflags = fcntl(fd, F_GETFL);//ÏÂÃæÁ½¾ä£ºÉèÖÃFASYNC±êÖ¾£¬Æô¶¯Ò첽֪ͨ±êÖ¾
fcntl(fd, F_SETFL, oflags | FASYNC);
É豸Çý¶¯ÖÐÒ첽֪ͨ±à³Ì±È½Ï¼òµ¥£¬Ö÷ÒªÓõ½Ò»ÏîÊý¾Ý½á¹¹ºÍÁ½¸öº¯Êý
Êý¾Ý½á¹¹£º
struct xxx_dev
{
Struct cdev cdev;
……
Struct fasync_struct *async_queue;
}
Int fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa);
Void kill_fasync(struct fasync_struct **fa, int sig, int band);
static int globalfifo_fasync(int fd, struct file *filp, int mode)
{
struct globalfifo_dev *dev = filp->private_data;
return fasync_helper(fd, filp, mode, &dev->async_queue);
}
static ssize_t globalfifo_write(struct file *filp, const char __user *buf,
size_t count, loff_t *ppos)
{
struct globalfifo_dev *dev = filp->private_data; //»ñµÃÉ豸½á¹¹ÌåÖ¸Õë
……
if (dev->async_queue)
kill_fasync(&dev->async_queue, SIGIO, POLL_IN);
ret = count;
}
int globalfifo_release(struct inode *inode, struct file *filp)
{
globalfifo_fasync( - 1, filp, 0);
return 0;
}
AIO»ù±¾Ë¼ÏëÊÇÔÊÐí½ø³Ì·¢ÆðºÜ¶àI/O²Ù×÷£¬¶ø²»ÓÃ×èÈû»òµÈ´ýÈκβÙ×÷Íê³É
Òì²½IOºÍ±ê×¼IOÖ®¼äµÄÁíÒ»¸öÇø±ðÊDz»ÄÜÁ¢¼´·ÃÎÊÕâ¸öº¯ÊýµÄ·µ»Ø×´Ì¬£¬ÒòΪ²¢Ã»ÓÐ×èÈûÔÚread()µ÷ÓÃÉÏ¡£ÔÚ±ê×¼µÄread()µ÷ÓÃÖУ¬·µ»Ø×´Ì¬ÊÇÔڸú¯Êý·µ»ØÊ±ÌṩµÄ£¬µ«ÊÇÔÚÒì²½IOÖУ¬ÎÒÃÇҪʹÓÃaio_return()º¯Êý£¬Ö»ÓÐÔÚaio_error()µ÷
Ïà¹ØÎĵµ£º
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <signal.h>
using namespace std;
extern char **environ;
void signal_handle(int signal_no){
cout << "sign:" &l ......
ʱ¼ä¼ä¸ô¶¨Ê±Æ÷
interval timer(ʱ¼ä¼ä¸ô¶¨Ê±Æ÷)ϵͳµ÷ÓÃ×Ô´Ó±»POSIX±ê×¼»¯ºó£¬Ê״γöÏÖÓÚ4.2BSD£¬Äܹ»Ìṩ±Èalarm()»¹¶àµÄ¿ØÖÆ£º
#include <sys/time.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
interval ti ......
ÔÚÓû§¿Õ¼ä£¬Ê¹ÓÃioctlϵͳµ÷ÓÃÀ´¿ØÖÆÉ豸£¬ÔÐÍÈçÏ£º
int ioctl(int fd, unsigned long cmd, ...);
µÚÈý¸ö²ÎÊý²»±íʾһ¸ö±äÊýÄ¿µÄ²ÎÊý£¬¶øÊÇÒ»¸öÀàÐÍ¿ÉÑ¡µÄ²ÎÊý¡£µÚÈý¸ö²ÎÊýÒÀÀµÓÚ¿ØÖÆÃüÁһЩÃüÁî²»ÓòÎÊý£¬Ò»Ð©ÓÃÒ»¸öÕûÊýÖµ£¬Ò»Ð©Ê¹ÓÃÖ¸Õë
1¡¢ioctlº¯Êý¶¨ÒåÃüÁî
ÔÚ±àдioctl´úÂë֮ǰ£¬Ê×ÏÈÐèÒª¶¨ÒåÃüÁΪÁË·ÀÖ¹ ......
ÖÐ¶ÏÆÁ±ÎµÄʹÓ÷½·¨£º
local_irq_disable() //¹ØÖжÏ
local_irq_enable() //¿ªÖжÏ
ÕâÁ½¸öº¯Êý¶¼Ö»ÄܽûÖ¹ºÍʹÄܱ¾cpuÄÚµÄÖжϣ¬Òò´Ë£¬²¢²»Äܽâ¾öSMP¶àcpuÒý·¢µÄ¾ºÌ¬¡£Òò´Ë£¬µ¥¶ÀʹÓÃÖÐ¶ÏÆÁ±Îͨ³£²»ÊÇÒ»ÖÖÖµµÃÍÆ¼öµÄ±ÜÃ⾺̬µÄ·½·¨£¬ËüÊÊÒËÓë×ÔÐýËøÁªºÏʹÓÃ
ÁíÍ⣬local_irq_save(flags)³ýÁ˽øÐнûÖ¹ÖжϲÙ×÷ÒÔÍ⣬»¹± ......