How to add message that will be read with dmesg?Why is Syslog Not Writing Logs To The Designated Files?Linux Centos with dmesg timestampBusy Debian server (Xen guest) seems to go to sleep (energy saving mode)QEMU: Solaris 11 / Sparc64 Guest on Linux / X86-64 HostAppArmor - root: “You do not have enough privilege to read the profile set.”How to disable perf subsystem in Linux kernel?Poor performance with Linux software raid-10Running dmesg on Docker results in “dmesg: read kernel buffer failed: Permission denied”How to use wget with redirect and long URL?Prevent kernel messages from appearing in dmesg

Why are Stein manifolds/spaces the analog of affine varieties/schemes in algebraic geometry?

How was Daenerys able to legitimise this character?

Is there a context where the expression `a.b::c` makes sense?

Dad jokes are fun

Manager questioning my time estimates for a project

Is superuser the same as root?

Shorten or merge multiple lines of `&> /dev/null &`

I know that there is a preselected candidate for a position to be filled at my department. What should I do?

Can I tell a prospective employee that everyone in the team is leaving?

How to patch glass cuts in a bicycle tire?

How do I get the ς (final sigma) symbol?

Dealing with spaghetti codebase, manager asks for things I can't deliver

Why does the hash of infinity have the digits of π?

Why is the Eisenstein ideal paper so great?

Is there any relationship between frequency of signal and distance it travels?

Why isn't 'chemically-strengthened glass' made with potassium carbonate to begin with?

What Armor Optimization applies to a Mithral full plate?

What are the conditions for RAA?

Should there be an "a" before "ten years imprisonment"?

What are Antecedent & Consequent Phrases in Music?

Drums and punctuation

Why did Drogon spare this character?

Can a person survive on blood in place of water?

Is it possible to remotely hack the GPS system and disable GPS service worldwide?



How to add message that will be read with dmesg?


Why is Syslog Not Writing Logs To The Designated Files?Linux Centos with dmesg timestampBusy Debian server (Xen guest) seems to go to sleep (energy saving mode)QEMU: Solaris 11 / Sparc64 Guest on Linux / X86-64 HostAppArmor - root: “You do not have enough privilege to read the profile set.”How to disable perf subsystem in Linux kernel?Poor performance with Linux software raid-10Running dmesg on Docker results in “dmesg: read kernel buffer failed: Permission denied”How to use wget with redirect and long URL?Prevent kernel messages from appearing in dmesg






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








42















I am trying to write some custom messages in my dmesg output. I tried:



logger "Hello"


but this does not work. It exits without error, but no "Hello" appears int the output of:



dmesg


I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.



Any idea?










share|improve this question




























    42















    I am trying to write some custom messages in my dmesg output. I tried:



    logger "Hello"


    but this does not work. It exits without error, but no "Hello" appears int the output of:



    dmesg


    I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.



    Any idea?










    share|improve this question
























      42












      42








      42


      14






      I am trying to write some custom messages in my dmesg output. I tried:



      logger "Hello"


      but this does not work. It exits without error, but no "Hello" appears int the output of:



      dmesg


      I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.



      Any idea?










      share|improve this question














      I am trying to write some custom messages in my dmesg output. I tried:



      logger "Hello"


      but this does not work. It exits without error, but no "Hello" appears int the output of:



      dmesg


      I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.



      Any idea?







      linux syslog dmesg






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked May 10 '10 at 18:24









      calandoacalandoa

      7002814




      7002814




















          7 Answers
          7






          active

          oldest

          votes


















          36














          dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.



          The most basic example of a driver with printk() would be:



          hello.c:



          #include <linux/module.h>
          #include <linux/kernel.h>

          int init_module(void)

          printk(KERN_INFO "Hello worldn");
          return 0;


          void cleanup_module(void)

          printk(KERN_INFO "Goodbye worldn");




          Makefile:



          obj-m += hello.o

          all:
          make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules


          Then:



          $ make
          $ sudo insmod hello.ko
          $ dmesg | tail -n1
          [7089996.746366] Hello world


          http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...






          share|improve this answer

























          • I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

            – Wilf
            Jul 11 '14 at 18:17



















          106














          You can, as root, write to /dev/kmsg to print to the kernel message buffer:



           fixnum:~# echo Some message > /dev/kmsg
          fixnum:~# dmesg | tail -n1
          [28078118.692242] Some message


          I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.






          share|improve this answer


















          • 1





            Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

            – dotancohen
            Jun 30 '12 at 8:53






          • 15





            Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

            – wvdschel
            Jul 4 '12 at 11:56







          • 3





            That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

            – dotancohen
            Jul 4 '12 at 14:55







          • 4





            Much easier than compiling kernel module

            – e271p314
            Mar 3 '14 at 9:22


















          13














          Based on Kyle's module above:




          #include <linux/module.h>
          #include <linux/kernel.h>
          #include <linux/init.h>
          #include <linux/proc_fs.h>
          #include <asm/uaccess.h>

          static int pk_write(struct file *file, const char *buffer, unsigned long count, void *data)

          char string[256];
          count = count < 255 ? count : 255;

          if(copy_from_user(string, buffer, count))
          return -EFAULT;

          string[count] = '';
          printk(string);
          return count;



          static int __init printk_init(void)

          struct proc_dir_entry *pk_file;

          pk_file = create_proc_entry("printk", 0222, NULL);
          if(pk_file == NULL)
          return -ENOMEM;

          pk_file->write_proc = pk_write;
          pk_file->owner = THIS_MODULE;

          return 0;


          static void __exit printk_cleanup(void)

          remove_proc_entry("printk", NULL);


          module_init(printk_init);
          module_exit(printk_cleanup);
          MODULE_LICENSE("GPL");


          To do a printk from user space:



          echo "Hello" > /proc/printk





          share|improve this answer


















          • 1





            This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

            – kevinf
            Nov 25 '15 at 21:00


















          5














          @Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...



          Code saved to printk_user.c



          #include <linux/module.h>
          #include <linux/kernel.h>
          #include <linux/proc_fs.h>
          #include <asm/uaccess.h>

          static ssize_t write_proc(struct file *filep, const char *buffer, size_t count, loff_t *offsetp)

          char string[256];
          count = count < 255 ? count : 255;

          if(copy_from_user(string, buffer, count) != 0)
          return -EFAULT;


          string[count] = '';
          printk(string);
          return count;


          static const struct file_operations proc_fops =
          .owner = THIS_MODULE,
          .write = write_proc,
          ;

          static int proc_init(void)
          struct proc_dir_entry *proc_file;
          proc_file = proc_create("printk_user", 0, NULL, &proc_fops);

          if(proc_file == NULL)
          return -ENOMEM;


          return 0;


          static void proc_cleanup(void)
          remove_proc_entry("printk_user", NULL);


          MODULE_LICENSE("GPL");
          module_init(proc_init);
          module_exit(proc_cleanup);


          Make using this Makefile



          TARGET = printk_user
          obj-m := $(TARGET).o

          KERNEL_VERSION=$(shell uname -r)
          KDIR = /lib/modules/$(KERNEL_VERSION)/build
          PWD = $(shell pwd)

          printk:
          $(MAKE) -C $(KDIR) M=$(PWD) modules

          clean:
          $(MAKE) -C $(KDIR) M=$(PWD) clean





          share|improve this answer






























            3














            Based off of Kyle's answer, here is a quick tutorial showing how to do just that.






            share|improve this answer






























              2














              Figured I'd go ahead and include a full blown example of something that people can just compile and run for those that aren't as skilled with C based off of @BuvinJ 's answer



              #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("%dn", getmysize);

              printf("To be written: %snSize of argument: %dn", argv[1], getmysize);
              // dmesgWarn dmesgInfo or dmesgDebug
              dmesgDebug(argv[1], getmysize);
              ;


              To run save the above as kmsg.c and gcc kmsg.c -o kmsg;sudo ./kmsg "string you want to add to /dev/kmsg"






              share|improve this answer






























                0














                I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:



                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 );





                share|improve this answer























                  Your Answer








                  StackExchange.ready(function()
                  var channelOptions =
                  tags: "".split(" "),
                  id: "2"
                  ;
                  initTagRenderer("".split(" "), "".split(" "), channelOptions);

                  StackExchange.using("externalEditor", function()
                  // Have to fire editor after snippets, if snippets enabled
                  if (StackExchange.settings.snippets.snippetsEnabled)
                  StackExchange.using("snippets", function()
                  createEditor();
                  );

                  else
                  createEditor();

                  );

                  function createEditor()
                  StackExchange.prepareEditor(
                  heartbeatType: 'answer',
                  autoActivateHeartbeat: false,
                  convertImagesToLinks: true,
                  noModals: true,
                  showLowRepImageUploadWarning: true,
                  reputationToPostImages: 10,
                  bindNavPrevention: true,
                  postfix: "",
                  imageUploader:
                  brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                  contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                  allowUrls: true
                  ,
                  onDemand: true,
                  discardSelector: ".discard-answer"
                  ,immediatelyShowMarkdownHelp:true
                  );



                  );













                  draft saved

                  draft discarded


















                  StackExchange.ready(
                  function ()
                  StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fserverfault.com%2fquestions%2f140354%2fhow-to-add-message-that-will-be-read-with-dmesg%23new-answer', 'question_page');

                  );

                  Post as a guest















                  Required, but never shown

























                  7 Answers
                  7






                  active

                  oldest

                  votes








                  7 Answers
                  7






                  active

                  oldest

                  votes









                  active

                  oldest

                  votes






                  active

                  oldest

                  votes









                  36














                  dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.



                  The most basic example of a driver with printk() would be:



                  hello.c:



                  #include <linux/module.h>
                  #include <linux/kernel.h>

                  int init_module(void)

                  printk(KERN_INFO "Hello worldn");
                  return 0;


                  void cleanup_module(void)

                  printk(KERN_INFO "Goodbye worldn");




                  Makefile:



                  obj-m += hello.o

                  all:
                  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules


                  Then:



                  $ make
                  $ sudo insmod hello.ko
                  $ dmesg | tail -n1
                  [7089996.746366] Hello world


                  http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...






                  share|improve this answer

























                  • I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                    – Wilf
                    Jul 11 '14 at 18:17
















                  36














                  dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.



                  The most basic example of a driver with printk() would be:



                  hello.c:



                  #include <linux/module.h>
                  #include <linux/kernel.h>

                  int init_module(void)

                  printk(KERN_INFO "Hello worldn");
                  return 0;


                  void cleanup_module(void)

                  printk(KERN_INFO "Goodbye worldn");




                  Makefile:



                  obj-m += hello.o

                  all:
                  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules


                  Then:



                  $ make
                  $ sudo insmod hello.ko
                  $ dmesg | tail -n1
                  [7089996.746366] Hello world


                  http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...






                  share|improve this answer

























                  • I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                    – Wilf
                    Jul 11 '14 at 18:17














                  36












                  36








                  36







                  dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.



                  The most basic example of a driver with printk() would be:



                  hello.c:



                  #include <linux/module.h>
                  #include <linux/kernel.h>

                  int init_module(void)

                  printk(KERN_INFO "Hello worldn");
                  return 0;


                  void cleanup_module(void)

                  printk(KERN_INFO "Goodbye worldn");




                  Makefile:



                  obj-m += hello.o

                  all:
                  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules


                  Then:



                  $ make
                  $ sudo insmod hello.ko
                  $ dmesg | tail -n1
                  [7089996.746366] Hello world


                  http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...






                  share|improve this answer















                  dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.



                  The most basic example of a driver with printk() would be:



                  hello.c:



                  #include <linux/module.h>
                  #include <linux/kernel.h>

                  int init_module(void)

                  printk(KERN_INFO "Hello worldn");
                  return 0;


                  void cleanup_module(void)

                  printk(KERN_INFO "Goodbye worldn");




                  Makefile:



                  obj-m += hello.o

                  all:
                  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules


                  Then:



                  $ make
                  $ sudo insmod hello.ko
                  $ dmesg | tail -n1
                  [7089996.746366] Hello world


                  http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited May 4 '15 at 20:01









                  kasperd

                  26.9k1252104




                  26.9k1252104










                  answered May 10 '10 at 18:30









                  Kyle BrandtKyle Brandt

                  66.8k62265414




                  66.8k62265414












                  • I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                    – Wilf
                    Jul 11 '14 at 18:17


















                  • I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                    – Wilf
                    Jul 11 '14 at 18:17

















                  I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                  – Wilf
                  Jul 11 '14 at 18:17






                  I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                  – Wilf
                  Jul 11 '14 at 18:17














                  106














                  You can, as root, write to /dev/kmsg to print to the kernel message buffer:



                   fixnum:~# echo Some message > /dev/kmsg
                  fixnum:~# dmesg | tail -n1
                  [28078118.692242] Some message


                  I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.






                  share|improve this answer


















                  • 1





                    Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                    – dotancohen
                    Jun 30 '12 at 8:53






                  • 15





                    Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                    – wvdschel
                    Jul 4 '12 at 11:56







                  • 3





                    That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                    – dotancohen
                    Jul 4 '12 at 14:55







                  • 4





                    Much easier than compiling kernel module

                    – e271p314
                    Mar 3 '14 at 9:22















                  106














                  You can, as root, write to /dev/kmsg to print to the kernel message buffer:



                   fixnum:~# echo Some message > /dev/kmsg
                  fixnum:~# dmesg | tail -n1
                  [28078118.692242] Some message


                  I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.






                  share|improve this answer


















                  • 1





                    Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                    – dotancohen
                    Jun 30 '12 at 8:53






                  • 15





                    Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                    – wvdschel
                    Jul 4 '12 at 11:56







                  • 3





                    That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                    – dotancohen
                    Jul 4 '12 at 14:55







                  • 4





                    Much easier than compiling kernel module

                    – e271p314
                    Mar 3 '14 at 9:22













                  106












                  106








                  106







                  You can, as root, write to /dev/kmsg to print to the kernel message buffer:



                   fixnum:~# echo Some message > /dev/kmsg
                  fixnum:~# dmesg | tail -n1
                  [28078118.692242] Some message


                  I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.






                  share|improve this answer













                  You can, as root, write to /dev/kmsg to print to the kernel message buffer:



                   fixnum:~# echo Some message > /dev/kmsg
                  fixnum:~# dmesg | tail -n1
                  [28078118.692242] Some message


                  I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Feb 23 '12 at 14:47









                  wvdschelwvdschel

                  1,161273




                  1,161273







                  • 1





                    Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                    – dotancohen
                    Jun 30 '12 at 8:53






                  • 15





                    Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                    – wvdschel
                    Jul 4 '12 at 11:56







                  • 3





                    That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                    – dotancohen
                    Jul 4 '12 at 14:55







                  • 4





                    Much easier than compiling kernel module

                    – e271p314
                    Mar 3 '14 at 9:22












                  • 1





                    Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                    – dotancohen
                    Jun 30 '12 at 8:53






                  • 15





                    Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                    – wvdschel
                    Jul 4 '12 at 11:56







                  • 3





                    That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                    – dotancohen
                    Jul 4 '12 at 14:55







                  • 4





                    Much easier than compiling kernel module

                    – e271p314
                    Mar 3 '14 at 9:22







                  1




                  1





                  Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                  – dotancohen
                  Jun 30 '12 at 8:53





                  Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                  – dotancohen
                  Jun 30 '12 at 8:53




                  15




                  15





                  Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                  – wvdschel
                  Jul 4 '12 at 11:56






                  Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                  – wvdschel
                  Jul 4 '12 at 11:56





                  3




                  3





                  That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                  – dotancohen
                  Jul 4 '12 at 14:55






                  That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                  – dotancohen
                  Jul 4 '12 at 14:55





                  4




                  4





                  Much easier than compiling kernel module

                  – e271p314
                  Mar 3 '14 at 9:22





                  Much easier than compiling kernel module

                  – e271p314
                  Mar 3 '14 at 9:22











                  13














                  Based on Kyle's module above:




                  #include <linux/module.h>
                  #include <linux/kernel.h>
                  #include <linux/init.h>
                  #include <linux/proc_fs.h>
                  #include <asm/uaccess.h>

                  static int pk_write(struct file *file, const char *buffer, unsigned long count, void *data)

                  char string[256];
                  count = count < 255 ? count : 255;

                  if(copy_from_user(string, buffer, count))
                  return -EFAULT;

                  string[count] = '';
                  printk(string);
                  return count;



                  static int __init printk_init(void)

                  struct proc_dir_entry *pk_file;

                  pk_file = create_proc_entry("printk", 0222, NULL);
                  if(pk_file == NULL)
                  return -ENOMEM;

                  pk_file->write_proc = pk_write;
                  pk_file->owner = THIS_MODULE;

                  return 0;


                  static void __exit printk_cleanup(void)

                  remove_proc_entry("printk", NULL);


                  module_init(printk_init);
                  module_exit(printk_cleanup);
                  MODULE_LICENSE("GPL");


                  To do a printk from user space:



                  echo "Hello" > /proc/printk





                  share|improve this answer


















                  • 1





                    This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                    – kevinf
                    Nov 25 '15 at 21:00















                  13














                  Based on Kyle's module above:




                  #include <linux/module.h>
                  #include <linux/kernel.h>
                  #include <linux/init.h>
                  #include <linux/proc_fs.h>
                  #include <asm/uaccess.h>

                  static int pk_write(struct file *file, const char *buffer, unsigned long count, void *data)

                  char string[256];
                  count = count < 255 ? count : 255;

                  if(copy_from_user(string, buffer, count))
                  return -EFAULT;

                  string[count] = '';
                  printk(string);
                  return count;



                  static int __init printk_init(void)

                  struct proc_dir_entry *pk_file;

                  pk_file = create_proc_entry("printk", 0222, NULL);
                  if(pk_file == NULL)
                  return -ENOMEM;

                  pk_file->write_proc = pk_write;
                  pk_file->owner = THIS_MODULE;

                  return 0;


                  static void __exit printk_cleanup(void)

                  remove_proc_entry("printk", NULL);


                  module_init(printk_init);
                  module_exit(printk_cleanup);
                  MODULE_LICENSE("GPL");


                  To do a printk from user space:



                  echo "Hello" > /proc/printk





                  share|improve this answer


















                  • 1





                    This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                    – kevinf
                    Nov 25 '15 at 21:00













                  13












                  13








                  13







                  Based on Kyle's module above:




                  #include <linux/module.h>
                  #include <linux/kernel.h>
                  #include <linux/init.h>
                  #include <linux/proc_fs.h>
                  #include <asm/uaccess.h>

                  static int pk_write(struct file *file, const char *buffer, unsigned long count, void *data)

                  char string[256];
                  count = count < 255 ? count : 255;

                  if(copy_from_user(string, buffer, count))
                  return -EFAULT;

                  string[count] = '';
                  printk(string);
                  return count;



                  static int __init printk_init(void)

                  struct proc_dir_entry *pk_file;

                  pk_file = create_proc_entry("printk", 0222, NULL);
                  if(pk_file == NULL)
                  return -ENOMEM;

                  pk_file->write_proc = pk_write;
                  pk_file->owner = THIS_MODULE;

                  return 0;


                  static void __exit printk_cleanup(void)

                  remove_proc_entry("printk", NULL);


                  module_init(printk_init);
                  module_exit(printk_cleanup);
                  MODULE_LICENSE("GPL");


                  To do a printk from user space:



                  echo "Hello" > /proc/printk





                  share|improve this answer













                  Based on Kyle's module above:




                  #include <linux/module.h>
                  #include <linux/kernel.h>
                  #include <linux/init.h>
                  #include <linux/proc_fs.h>
                  #include <asm/uaccess.h>

                  static int pk_write(struct file *file, const char *buffer, unsigned long count, void *data)

                  char string[256];
                  count = count < 255 ? count : 255;

                  if(copy_from_user(string, buffer, count))
                  return -EFAULT;

                  string[count] = '';
                  printk(string);
                  return count;



                  static int __init printk_init(void)

                  struct proc_dir_entry *pk_file;

                  pk_file = create_proc_entry("printk", 0222, NULL);
                  if(pk_file == NULL)
                  return -ENOMEM;

                  pk_file->write_proc = pk_write;
                  pk_file->owner = THIS_MODULE;

                  return 0;


                  static void __exit printk_cleanup(void)

                  remove_proc_entry("printk", NULL);


                  module_init(printk_init);
                  module_exit(printk_cleanup);
                  MODULE_LICENSE("GPL");


                  To do a printk from user space:



                  echo "Hello" > /proc/printk






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered May 11 '10 at 9:34









                  calandoacalandoa

                  7002814




                  7002814







                  • 1





                    This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                    – kevinf
                    Nov 25 '15 at 21:00












                  • 1





                    This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                    – kevinf
                    Nov 25 '15 at 21:00







                  1




                  1





                  This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                  – kevinf
                  Nov 25 '15 at 21:00





                  This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                  – kevinf
                  Nov 25 '15 at 21:00











                  5














                  @Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...



                  Code saved to printk_user.c



                  #include <linux/module.h>
                  #include <linux/kernel.h>
                  #include <linux/proc_fs.h>
                  #include <asm/uaccess.h>

                  static ssize_t write_proc(struct file *filep, const char *buffer, size_t count, loff_t *offsetp)

                  char string[256];
                  count = count < 255 ? count : 255;

                  if(copy_from_user(string, buffer, count) != 0)
                  return -EFAULT;


                  string[count] = '';
                  printk(string);
                  return count;


                  static const struct file_operations proc_fops =
                  .owner = THIS_MODULE,
                  .write = write_proc,
                  ;

                  static int proc_init(void)
                  struct proc_dir_entry *proc_file;
                  proc_file = proc_create("printk_user", 0, NULL, &proc_fops);

                  if(proc_file == NULL)
                  return -ENOMEM;


                  return 0;


                  static void proc_cleanup(void)
                  remove_proc_entry("printk_user", NULL);


                  MODULE_LICENSE("GPL");
                  module_init(proc_init);
                  module_exit(proc_cleanup);


                  Make using this Makefile



                  TARGET = printk_user
                  obj-m := $(TARGET).o

                  KERNEL_VERSION=$(shell uname -r)
                  KDIR = /lib/modules/$(KERNEL_VERSION)/build
                  PWD = $(shell pwd)

                  printk:
                  $(MAKE) -C $(KDIR) M=$(PWD) modules

                  clean:
                  $(MAKE) -C $(KDIR) M=$(PWD) clean





                  share|improve this answer



























                    5














                    @Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...



                    Code saved to printk_user.c



                    #include <linux/module.h>
                    #include <linux/kernel.h>
                    #include <linux/proc_fs.h>
                    #include <asm/uaccess.h>

                    static ssize_t write_proc(struct file *filep, const char *buffer, size_t count, loff_t *offsetp)

                    char string[256];
                    count = count < 255 ? count : 255;

                    if(copy_from_user(string, buffer, count) != 0)
                    return -EFAULT;


                    string[count] = '';
                    printk(string);
                    return count;


                    static const struct file_operations proc_fops =
                    .owner = THIS_MODULE,
                    .write = write_proc,
                    ;

                    static int proc_init(void)
                    struct proc_dir_entry *proc_file;
                    proc_file = proc_create("printk_user", 0, NULL, &proc_fops);

                    if(proc_file == NULL)
                    return -ENOMEM;


                    return 0;


                    static void proc_cleanup(void)
                    remove_proc_entry("printk_user", NULL);


                    MODULE_LICENSE("GPL");
                    module_init(proc_init);
                    module_exit(proc_cleanup);


                    Make using this Makefile



                    TARGET = printk_user
                    obj-m := $(TARGET).o

                    KERNEL_VERSION=$(shell uname -r)
                    KDIR = /lib/modules/$(KERNEL_VERSION)/build
                    PWD = $(shell pwd)

                    printk:
                    $(MAKE) -C $(KDIR) M=$(PWD) modules

                    clean:
                    $(MAKE) -C $(KDIR) M=$(PWD) clean





                    share|improve this answer

























                      5












                      5








                      5







                      @Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...



                      Code saved to printk_user.c



                      #include <linux/module.h>
                      #include <linux/kernel.h>
                      #include <linux/proc_fs.h>
                      #include <asm/uaccess.h>

                      static ssize_t write_proc(struct file *filep, const char *buffer, size_t count, loff_t *offsetp)

                      char string[256];
                      count = count < 255 ? count : 255;

                      if(copy_from_user(string, buffer, count) != 0)
                      return -EFAULT;


                      string[count] = '';
                      printk(string);
                      return count;


                      static const struct file_operations proc_fops =
                      .owner = THIS_MODULE,
                      .write = write_proc,
                      ;

                      static int proc_init(void)
                      struct proc_dir_entry *proc_file;
                      proc_file = proc_create("printk_user", 0, NULL, &proc_fops);

                      if(proc_file == NULL)
                      return -ENOMEM;


                      return 0;


                      static void proc_cleanup(void)
                      remove_proc_entry("printk_user", NULL);


                      MODULE_LICENSE("GPL");
                      module_init(proc_init);
                      module_exit(proc_cleanup);


                      Make using this Makefile



                      TARGET = printk_user
                      obj-m := $(TARGET).o

                      KERNEL_VERSION=$(shell uname -r)
                      KDIR = /lib/modules/$(KERNEL_VERSION)/build
                      PWD = $(shell pwd)

                      printk:
                      $(MAKE) -C $(KDIR) M=$(PWD) modules

                      clean:
                      $(MAKE) -C $(KDIR) M=$(PWD) clean





                      share|improve this answer













                      @Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...



                      Code saved to printk_user.c



                      #include <linux/module.h>
                      #include <linux/kernel.h>
                      #include <linux/proc_fs.h>
                      #include <asm/uaccess.h>

                      static ssize_t write_proc(struct file *filep, const char *buffer, size_t count, loff_t *offsetp)

                      char string[256];
                      count = count < 255 ? count : 255;

                      if(copy_from_user(string, buffer, count) != 0)
                      return -EFAULT;


                      string[count] = '';
                      printk(string);
                      return count;


                      static const struct file_operations proc_fops =
                      .owner = THIS_MODULE,
                      .write = write_proc,
                      ;

                      static int proc_init(void)
                      struct proc_dir_entry *proc_file;
                      proc_file = proc_create("printk_user", 0, NULL, &proc_fops);

                      if(proc_file == NULL)
                      return -ENOMEM;


                      return 0;


                      static void proc_cleanup(void)
                      remove_proc_entry("printk_user", NULL);


                      MODULE_LICENSE("GPL");
                      module_init(proc_init);
                      module_exit(proc_cleanup);


                      Make using this Makefile



                      TARGET = printk_user
                      obj-m := $(TARGET).o

                      KERNEL_VERSION=$(shell uname -r)
                      KDIR = /lib/modules/$(KERNEL_VERSION)/build
                      PWD = $(shell pwd)

                      printk:
                      $(MAKE) -C $(KDIR) M=$(PWD) modules

                      clean:
                      $(MAKE) -C $(KDIR) M=$(PWD) clean






                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Nov 25 '15 at 20:59









                      kevinfkevinf

                      17116




                      17116





















                          3














                          Based off of Kyle's answer, here is a quick tutorial showing how to do just that.






                          share|improve this answer



























                            3














                            Based off of Kyle's answer, here is a quick tutorial showing how to do just that.






                            share|improve this answer

























                              3












                              3








                              3







                              Based off of Kyle's answer, here is a quick tutorial showing how to do just that.






                              share|improve this answer













                              Based off of Kyle's answer, here is a quick tutorial showing how to do just that.







                              share|improve this answer












                              share|improve this answer



                              share|improve this answer










                              answered May 10 '10 at 18:35









                              TCampbellTCampbell

                              1,8941212




                              1,8941212





















                                  2














                                  Figured I'd go ahead and include a full blown example of something that people can just compile and run for those that aren't as skilled with C based off of @BuvinJ 's answer



                                  #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("%dn", getmysize);

                                  printf("To be written: %snSize of argument: %dn", argv[1], getmysize);
                                  // dmesgWarn dmesgInfo or dmesgDebug
                                  dmesgDebug(argv[1], getmysize);
                                  ;


                                  To run save the above as kmsg.c and gcc kmsg.c -o kmsg;sudo ./kmsg "string you want to add to /dev/kmsg"






                                  share|improve this answer



























                                    2














                                    Figured I'd go ahead and include a full blown example of something that people can just compile and run for those that aren't as skilled with C based off of @BuvinJ 's answer



                                    #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("%dn", getmysize);

                                    printf("To be written: %snSize of argument: %dn", argv[1], getmysize);
                                    // dmesgWarn dmesgInfo or dmesgDebug
                                    dmesgDebug(argv[1], getmysize);
                                    ;


                                    To run save the above as kmsg.c and gcc kmsg.c -o kmsg;sudo ./kmsg "string you want to add to /dev/kmsg"






                                    share|improve this answer

























                                      2












                                      2








                                      2







                                      Figured I'd go ahead and include a full blown example of something that people can just compile and run for those that aren't as skilled with C based off of @BuvinJ 's answer



                                      #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("%dn", getmysize);

                                      printf("To be written: %snSize of argument: %dn", argv[1], getmysize);
                                      // dmesgWarn dmesgInfo or dmesgDebug
                                      dmesgDebug(argv[1], getmysize);
                                      ;


                                      To run save the above as kmsg.c and gcc kmsg.c -o kmsg;sudo ./kmsg "string you want to add to /dev/kmsg"






                                      share|improve this answer













                                      Figured I'd go ahead and include a full blown example of something that people can just compile and run for those that aren't as skilled with C based off of @BuvinJ 's answer



                                      #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("%dn", getmysize);

                                      printf("To be written: %snSize of argument: %dn", argv[1], getmysize);
                                      // dmesgWarn dmesgInfo or dmesgDebug
                                      dmesgDebug(argv[1], getmysize);
                                      ;


                                      To run save the above as kmsg.c and gcc kmsg.c -o kmsg;sudo ./kmsg "string you want to add to /dev/kmsg"







                                      share|improve this answer












                                      share|improve this answer



                                      share|improve this answer










                                      answered May 10 at 20:29









                                      linuxgeeklinuxgeek

                                      212




                                      212





















                                          0














                                          I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:



                                          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 );





                                          share|improve this answer



























                                            0














                                            I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:



                                            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 );





                                            share|improve this answer

























                                              0












                                              0








                                              0







                                              I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:



                                              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 );





                                              share|improve this answer













                                              I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:



                                              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 );






                                              share|improve this answer












                                              share|improve this answer



                                              share|improve this answer










                                              answered Mar 19 at 23:54









                                              BuvinJBuvinJ

                                              22918




                                              22918



























                                                  draft saved

                                                  draft discarded
















































                                                  Thanks for contributing an answer to Server Fault!


                                                  • Please be sure to answer the question. Provide details and share your research!

                                                  But avoid


                                                  • Asking for help, clarification, or responding to other answers.

                                                  • Making statements based on opinion; back them up with references or personal experience.

                                                  To learn more, see our tips on writing great answers.




                                                  draft saved


                                                  draft discarded














                                                  StackExchange.ready(
                                                  function ()
                                                  StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fserverfault.com%2fquestions%2f140354%2fhow-to-add-message-that-will-be-read-with-dmesg%23new-answer', 'question_page');

                                                  );

                                                  Post as a guest















                                                  Required, but never shown





















































                                                  Required, but never shown














                                                  Required, but never shown












                                                  Required, but never shown







                                                  Required, but never shown

































                                                  Required, but never shown














                                                  Required, but never shown












                                                  Required, but never shown







                                                  Required, but never shown







                                                  Popular posts from this blog

                                                  Club Baloncesto Breogán Índice Historia | Pavillón | Nome | O Breogán na cultura popular | Xogadores | Adestradores | Presidentes | Palmarés | Historial | Líderes | Notas | Véxase tamén | Menú de navegacióncbbreogan.galCadroGuía oficial da ACB 2009-10, páxina 201Guía oficial ACB 1992, páxina 183. Editorial DB.É de 6.500 espectadores sentados axeitándose á última normativa"Estudiantes Junior, entre as mellores canteiras"o orixinalHemeroteca El Mundo Deportivo, 16 setembro de 1970, páxina 12Historia do BreogánAlfredo Pérez, o último canoneiroHistoria C.B. BreogánHemeroteca de El Mundo DeportivoJimmy Wright, norteamericano do Breogán deixará Lugo por ameazas de morteResultados de Breogán en 1986-87Resultados de Breogán en 1990-91Ficha de Velimir Perasović en acb.comResultados de Breogán en 1994-95Breogán arrasa al Barça. "El Mundo Deportivo", 27 de setembro de 1999, páxina 58CB Breogán - FC BarcelonaA FEB invita a participar nunha nova Liga EuropeaCharlie Bell na prensa estatalMáximos anotadores 2005Tempada 2005-06 : Tódolos Xogadores da Xornada""Non quero pensar nunha man negra, mais pregúntome que está a pasar""o orixinalRaúl López, orgulloso dos xogadores, presume da boa saúde económica do BreogánJulio González confirma que cesa como presidente del BreogánHomenaxe a Lisardo GómezA tempada do rexurdimento celesteEntrevista a Lisardo GómezEl COB dinamita el Pazo para forzar el quinto (69-73)Cafés Candelas, patrocinador del CB Breogán"Suso Lázare, novo presidente do Breogán"o orixinalCafés Candelas Breogán firma el mayor triunfo de la historiaEl Breogán realizará 17 homenajes por su cincuenta aniversario"O Breogán honra ao seu fundador e primeiro presidente"o orixinalMiguel Giao recibiu a homenaxe do PazoHomenaxe aos primeiros gladiadores celestesO home que nos amosa como ver o Breo co corazónTita Franco será homenaxeada polos #50anosdeBreoJulio Vila recibirá unha homenaxe in memoriam polos #50anosdeBreo"O Breogán homenaxeará aos seus aboados máis veteráns"Pechada ovación a «Capi» Sanmartín e Ricardo «Corazón de González»Homenaxe por décadas de informaciónPaco García volve ao Pazo con motivo do 50 aniversario"Resultados y clasificaciones""O Cafés Candelas Breogán, campión da Copa Princesa""O Cafés Candelas Breogán, equipo ACB"C.B. Breogán"Proxecto social"o orixinal"Centros asociados"o orixinalFicha en imdb.comMario Camus trata la recuperación del amor en 'La vieja música', su última película"Páxina web oficial""Club Baloncesto Breogán""C. B. Breogán S.A.D."eehttp://www.fegaba.com

                                                  Vilaño, A Laracha Índice Patrimonio | Lugares e parroquias | Véxase tamén | Menú de navegación43°14′52″N 8°36′03″O / 43.24775, -8.60070

                                                  Cegueira Índice Epidemioloxía | Deficiencia visual | Tipos de cegueira | Principais causas de cegueira | Tratamento | Técnicas de adaptación e axudas | Vida dos cegos | Primeiros auxilios | Crenzas respecto das persoas cegas | Crenzas das persoas cegas | O neno deficiente visual | Aspectos psicolóxicos da cegueira | Notas | Véxase tamén | Menú de navegación54.054.154.436928256blindnessDicionario da Real Academia GalegaPortal das Palabras"International Standards: Visual Standards — Aspects and Ranges of Vision Loss with Emphasis on Population Surveys.""Visual impairment and blindness""Presentan un plan para previr a cegueira"o orixinalACCDV Associació Catalana de Cecs i Disminuïts Visuals - PMFTrachoma"Effect of gene therapy on visual function in Leber's congenital amaurosis"1844137110.1056/NEJMoa0802268Cans guía - os mellores amigos dos cegosArquivadoEscola de cans guía para cegos en Mortágua, PortugalArquivado"Tecnología para ciegos y deficientes visuales. Recopilación de recursos gratuitos en la Red""Colorino""‘COL.diesis’, escuchar los sonidos del color""COL.diesis: Transforming Colour into Melody and Implementing the Result in a Colour Sensor Device"o orixinal"Sistema de desarrollo de sinestesia color-sonido para invidentes utilizando un protocolo de audio""Enseñanza táctil - geometría y color. Juegos didácticos para niños ciegos y videntes""Sistema Constanz"L'ocupació laboral dels cecs a l'Estat espanyol està pràcticament equiparada a la de les persones amb visió, entrevista amb Pedro ZuritaONCE (Organización Nacional de Cegos de España)Prevención da cegueiraDescrición de deficiencias visuais (Disc@pnet)Braillín, un boneco atractivo para calquera neno, con ou sen discapacidade, que permite familiarizarse co sistema de escritura e lectura brailleAxudas Técnicas36838ID00897494007150-90057129528256DOID:1432HP:0000618D001766C10.597.751.941.162C97109C0155020