Pour obtenir le signal à partir du noyau vers l'espace utilisateur d'utiliser le code suivant dans votre espace utilisateur et l'espace noyau de code comme ci-dessous :
void signal_handler_func (int sig)
{
//handle the action corresponding to the signal here
}
l'Espace du noyau du Module :
int ret = 0;
struct siginfo info;
memset(&info, 0, sizeof(struct siginfo));
info.si_signo = SIG_TEST;
info.si_code = SI_QUEUE;
info.si_int = 1234;
send_sig_info(SIG_TEST, &info, t);//send signal to user land
t est le PID de l'application de l'utilisateur.
Pouvez-vous veuillez donner l'exemple complet? Aussi, comment puis-je connaître le pid de l'application de l'utilisateur? de l'espace utilisateur de l'application peut enregistrer avec le module au moment de l'initialisation à l'aide de sockets netlink et , dans le registre de message, ils peuvent spécifier leur PID. Je l'ai fait, mais à l'aide de kill_proc_info() au lieu de send_sig_info(). Vous pouvez utiliser le for_each_process() macro pour trouver le processus par nom et c'est faire le PID.
Utiliser le noyau de la fonction de l'API kill_proc_info(int sig, struct siginfo *info, pid_t pid)
NOTE C'est en fait une mauvaise réponse. Les fonctions ne envoyer un signal à l'utilisateur de l'espace, mais de la bonne façon de le faire, que le demandeur a l'intention est d'utiliser le fasync caractère périphérique de la méthode, comme indiqué ici: http://www.xml.com/ldd/chapter/book/ch05.html#t4
#include<linux/module.h> #include<linux/kernel.h> #include </linux signal.h> int init_module() { // int i,res=0; // char msg1[80]; struct siginfo info; printk(KERN_ALERT"\n " HELLO WORLD!!"); info.si_signo = 14; // VOUS DONNER le NUMÉRO de SIGNAL ICI!!!!! info.si_errno = 0; info.si_code = SI_USER; info.si_pid = actuel->tgid; info.si_uid = actuel->uid; kill_proc_info(14, &info, 553); return 0; }void cleanup_module(){printk(KERN_ALERT"\n au revoir!");}MODULE_LICENSE("GPL"); sir me dire quel est le fichier d'en-tête? fichier d'en-tête pour le noyau de la fonction de l'API kill_proc_info(int sig, struct siginfo *info, pid_t pid) lors de l'exécution de mon programme, j'ai obtenu l'erreur suivante /home/wasimtabrez/Travail/int/signal2.c: Dans la fonction init_module’: /home/wasimtabrez/Travail/int/signal2.c:24: erreur: déréférencement de pointeur de type incomplète /home/wasimtabrez/Travail/int/signal2.c:25: erreur: déréférencement de pointeur de type incomplète /home/wasimtabrez/Travail/int/signal2.c:27: erreur: implicit declaration of function ‘kill_proc_info’ make[2]: *** [/maison/wasimtabrez/Travail/int/signal2.o] Erreur 1 make[1]: *** [_module_/home/wasimtabrez/Travail/int] Erreur 2 make[1]: Quittant le répertoire `/usr/src/linux-headers-2.6.35-28-générique de' make: *** [all] Erreur 2
Il ya quelque chose appelé un NetLink interface qui fournit un ensemble d'API pour la communication entre un noyau et un processus utilisateur.Il est semblable à la prise de l'interface et de la communication est asynchrone et est donc préféré à IOCTL.
Pour obtenir le signal à partir du noyau vers l'espace utilisateur d'utiliser le code suivant dans votre espace utilisateur et l'espace noyau de code comme ci-dessous :
de l'espace utilisateur de l'application :
définir signal_handler_func fonction :
l'Espace du noyau du Module :
t est le PID de l'application de l'utilisateur.
Aussi, comment puis-je connaître le pid de l'application de l'utilisateur?
de l'espace utilisateur de l'application peut enregistrer avec le module au moment de l'initialisation à l'aide de sockets netlink et , dans le registre de message, ils peuvent spécifier leur PID.
Je l'ai fait, mais à l'aide de
kill_proc_info()
au lieu desend_sig_info()
. Vous pouvez utiliser lefor_each_process()
macro pour trouver le processus par nom et c'est faire le PID.OriginalL'auteur Raulp
Utiliser le noyau de la fonction de l'API kill_proc_info(int sig, struct siginfo *info, pid_t pid)
NOTE C'est en fait une mauvaise réponse. Les fonctions ne envoyer un signal à l'utilisateur de l'espace, mais de la bonne façon de le faire, que le demandeur a l'intention est d'utiliser le fasync caractère périphérique de la méthode, comme indiqué ici: http://www.xml.com/ldd/chapter/book/ch05.html#t4
sir me dire quel est le fichier d'en-tête?
fichier d'en-tête pour le noyau de la fonction de l'API kill_proc_info(int sig, struct siginfo *info, pid_t pid)
lors de l'exécution de mon programme, j'ai obtenu l'erreur suivante
/home/wasimtabrez/Travail/int/signal2.c: Dans la fonction init_module’: /home/wasimtabrez/Travail/int/signal2.c:24: erreur: déréférencement de pointeur de type incomplète /home/wasimtabrez/Travail/int/signal2.c:25: erreur: déréférencement de pointeur de type incomplète /home/wasimtabrez/Travail/int/signal2.c:27: erreur: implicit declaration of function ‘kill_proc_info’ make[2]: *** [/maison/wasimtabrez/Travail/int/signal2.o] Erreur 1 make[1]: *** [_module_/home/wasimtabrez/Travail/int] Erreur 2 make[1]: Quittant le répertoire `/usr/src/linux-headers-2.6.35-28-générique de' make: *** [all] Erreur 2
OriginalL'auteur gby
Il ya quelque chose appelé un NetLink interface qui fournit un ensemble d'API pour la communication entre un noyau et un processus utilisateur.Il est semblable à la prise de l'interface et de la communication est asynchrone et est donc préféré à IOCTL.
Aperçu ici: http://www.linuxjournal.com/article/7356
OriginalL'auteur liv2hak