核心模組向使用者程序傳送訊息

2021-05-12 18:49:46 字數 3836 閱讀 3456

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函式,訊息發到指定的視...