kpp.c
---------------------------------------------
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define kppmajor 240
#define module_name "kpp"
#define hold_irq magus_gpio_hold
#define kpp_get _ior('f', 2, int)
//<< //work queue struct struct work_struct hold_wq; void hold_do_work(void); static int gvalue; static struct class *hold_class; static int number; void hold_do_work(void) schedule_work(&hold_wq); } else msleep(100); }static irqreturn_t hold_isr(int irq, void *dev_id) return irq_handled; }static int kpp_fasync(int fd, struct file *filp, int mode) static int kpp_release(struct inode *inode, struct file *filp) static int kpp_open(struct inode *inode, struct file *filp) static int kpp_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) return 0; }static struct file_operations g_kpp_fops = ; static void kpp_setup_cdev(struct kpp_dev *dev, int index) static dev_t devno; static void register_kpp(void) class_device_create(hold_class, null, devno, null, "hold"); }static int __init kpp_init(void) /*init work queue for hold irq */ init_work(&hold_wq, (void (*)(void *)) hold_do_work); printk("solomon systech limited/n"); return 0; }static void __exit kpp_cleanup(void) module_init(kpp_init); module_exit(kpp_cleanup); module_description("magus keypad driver"); module_license("gpl"); kpptest.c --------------------------------------------- #include #include #include #include #include #include #include #include #include #define kpp_get _ior('f', 2, int) static int fd; void gpiovol_handler(int sigum) int main() // 當按下hold鍵後,hold driver將向該程序傳送sigio訊號 signal(sigio, gpiovol_handler); // f_setown設定接收sigio和sigurg訊號的程序id或程序組id.正的 // arg指定乙個程序id,負的arg表示等於arg絕對值的乙個程序組id fcntl(fd, f_setown, getpid()); oflags = fcntl(fd, f_getfl); fcntl(fd, f_setfl, oflags | fasync); // (1) while (1) ; return 0; }(1) 當乙個檔案的fasync標誌變化時(呼叫fcntl()函式,設定fasync檔案標誌時),該檔案所對應的裝置驅動的fasync()介面將被呼叫。 驅動程式向使用者程式發訊號 --------------------------------------------- 當裝置有io事件發生,就有機制保證向應用程序傳送訊號,顯然裝置驅動程式扮演重要角色,實際終端tty、網路socket等的標準實現已經包括了實時訊號驅動的支援,所以,在linux中它們可以如上直接使用。但有些裝置的驅動程式還並沒有支援,所以需要定製裝置驅動程式。以下兩個api應該是可以遮蔽所有相關瑣碎操作(類似send_sig())的標準介面: intfasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa); voidkill_fasync(struct fasync_struct **fa, int sig, int band); 如果需要支援非同步通知機制,如下裝置結構中需要有非同步事件通知佇列(它應該與睡眠佇列類似),並且增加fasync()介面的實現(該函式將本程序登記到async_queue上去)。 當乙個開啟的檔案fasync標誌變化時(呼叫fcntl()函式,設定fasync檔案標誌時),fasync()介面將被呼叫。 struct kpp_dev ; static int kpp_fasync(int fd, struct file *filp, int mode) 事件發生的時機,就是中斷服務程式或相應的軟中斷中呼叫kill_fasync(): if (dev->async_queue) kill_fasync(&dev->async_queue, sigio, poll_in); 如果是寫操作,就是poll_out。注意,無論使用者程序設定了什麼期望的訊號,在這個環節,傳送的一般就是sigio。注意在裝置檔案關閉(release方法)時,注意執行fasync(),使得本檔案的操作從上述的裝置非同步事件等待鍊錶中剝離。 static int kpp_release(struct inode *inode, struct file *filp) region 程序傳送訊息 public const int wm copydata 0x004a dllimport user32.dll entrypoint findwindow public static extern intptr findwindow string lpclassname... 關於重試的訊息排重,有msgid的訊息推薦使用msgid排重。事件型別訊息推薦使用fromusername createtime 排重。1 開發者在5秒內未回覆任何內容 2 開發者回覆了異常資料,比如json資料等各訊息型別需要的xml資料報結構如下。12345678 引數 是否必須 描述touse... 跨程序訊息以及資料傳送 訊息機制是windows的乙個特點。在windows開發中基本上都會用到訊息傳送以及接收,突別是對於ui介面開發這一塊。程序之間相互通訊的方式有很多,其中包括跨程序訊息。訊息傳送 最常用的是使用sendmessage以及postmessage 系統api函式,訊息發到指定的視...程序傳送訊息
傳送訊息 被動回覆使用者訊息
跨程序訊息以及資料傳送