54 votes

Comment ajouter un message qui sera lu par dmesg ?

J'essaie d'écrire des messages personnalisés dans ma sortie dmesg. J'ai essayé :

logger "Hello"

mais cela ne fonctionne pas. Il sort sans erreur, mais aucun "Hello" n'apparaît dans la sortie de :

dmesg

J'utilise une Fedora 9, et il semble qu'il n'y ait pas de démon syslogd/klogd en cours d'exécution. Cependant, tous les messages du noyau sont écrits avec succès dans le tampon dmesg.

Une idée ?

3voto

linuxgeek Points 61

Je me suis dit que j'allais inclure un exemple complet de quelque chose que les gens peuvent simplement compiler et exécuter pour ceux qui ne sont pas aussi doués en C, en me basant sur la réponse de @BuvinJ.

#include <stdio.h>
#include <string.h>
#include <fcntl.h> // open function
#include <unistd.h> // close function
#include "sys/syscall.h"

int main(); // Let's not worry about this for now

void dmesg( const char *tag, const char *msg, const int len )
{
    const int TAG_LEN=3;
    char buffer[128]={0};
    memcpy( &buffer[0], tag, TAG_LEN );
    memcpy( &buffer[TAG_LEN], msg, len );
    int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
    write( fd_kmsg, &buffer, TAG_LEN+len );
    close( fd_kmsg );
}
void dmesgWarn(  const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
void dmesgInfo(  const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }

int main(int argc, char **argv)
{
    int getmysize = strlen(argv[1]);
    printf("%d\n", getmysize);

    printf("To be written: %s\nSize of argument: %d\n", argv[1], getmysize);
    // dmesgWarn dmesgInfo or dmesgDebug
    dmesgDebug(argv[1], getmysize);
};

Pour l'exécuter, sauvegardez le texte ci-dessus sous la forme kmsg.c puis exécuter gcc kmsg.c -o kmsg et s'exécuter en tant que sudo ./kmsg "string you want to add to /dev/kmsg"

2voto

BuvinJ Points 399

Je voulais juste des messages de débogage rapides dans un démon écrit par quelqu'un d'autre dans un noyau cross-complied. J'ai rencontré une erreur de compilation en essayant d'utiliser printk , comme <linux/module.h> n'a pas pu être incluse. Plutôt que de m'acharner sur ce point (pour faire les choses correctement), j'ai triché et j'ai utilisé la solution de contournement de 5 minutes, paresseuse mais fonctionnelle, qui suit :

void dmesg( const char *tag, const char *msg, const int len )
{
    const int TAG_LEN=3;
    char buffer[128]={0};
    memcpy( &buffer[0], tag, TAG_LEN );
    memcpy( &buffer[TAG_LEN], msg, len );
    int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
    write( fd_kmsg, &buffer, TAG_LEN+len );
    close( fd_kmsg );
}
void dmesgWarn(  const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
void dmesgInfo(  const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X