mapcmp.c
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * Simple program to compare two mmap'd areas.
  3.  *
  4.  * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
  5.  * Copyright (C) 2001 O'Reilly & Associates
  6.  *
  7.  * The source code in this file can be freely used, adapted,
  8.  * and redistributed in source or binary form, so long as an
  9.  * acknowledgment appears in derived source files.  The citation
  10.  * should list that the code comes from the book "Linux Device
  11.  * Drivers" by Alessandro Rubini and Jonathan Corbet, published
  12.  * by O'Reilly & Associates.   No warranty is attached;
  13.  * we cannot take responsibility for errors or fitness for use.
  14.  */
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <unistd.h>
  18. #include <sys/mman.h>
  19. #include <sys/errno.h>
  20. #include <fcntl.h>
  21. static char *mapdev (const char *, int, int);
  22. /*
  23.  * memcmp dev1 dev2 offset pages
  24.  */
  25. int main (int argc, char **argv)
  26. {
  27. unsigned int offset, size, i;
  28. char *addr1, *addr2;
  29. /*
  30.  * Sanity check.
  31.  */
  32. if (argc != 5)
  33. {
  34. fprintf (stderr, "Usage: mapcmp dev1 dev2 offset pagesn");
  35. exit (1);
  36. }
  37. /*
  38.  * Map the two devices.
  39.  */
  40. offset = atoi (argv[3]);
  41. size = atoi (argv[4]);
  42. addr1 = mapdev (argv[1], offset, size);
  43. addr2 = mapdev (argv[2], offset, size);
  44. /*
  45.  * Do the comparison.
  46.  */
  47. printf ("Comparing...");
  48. fflush (stdout);
  49. for (i = 0; i < size; i++)
  50. if (*addr1++ != *addr2++)
  51. {
  52. printf ("areas differ at byte %dn", i);
  53. exit (0);
  54. }
  55. printf ("areas are identical.n");
  56. exit (0);
  57. }
  58. static char *mapdev (const char *dev, int offset, int size)
  59. {
  60. char *addr;
  61. int fd = open (dev, O_RDONLY);
  62. if (fd < 0)
  63. {
  64. perror (dev);
  65. exit (1);
  66. }
  67. addr = mmap (0, size, PROT_READ, MAP_PRIVATE, fd, offset);
  68. if (addr == MAP_FAILED)
  69. {
  70. perror (dev);
  71. exit (1);
  72. }
  73. printf ("Mapped %s (%d @ %d) at 0x%pn", dev, size, offset, addr);
  74. return (addr);
  75. }