Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从ruby访问系统资源_C_Ruby_Gem_Raspberry Pi_Hd44780 - Fatal编程技术网

C 从ruby访问系统资源

C 从ruby访问系统资源,c,ruby,gem,raspberry-pi,hd44780,C,Ruby,Gem,Raspberry Pi,Hd44780,我正在为Hitachi-44780库为Raspberry Pi编写ruby包装。库本身是用C编写的。 我有以下代码试图打开/dev/mem void setup_io() { /* open /dev/mem */ if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) { printf("can't open /dev/mem \n"); exit (-1); } // Allocate

我正在为Hitachi-44780库为Raspberry Pi编写ruby包装。库本身是用C编写的。 我有以下代码试图打开
/dev/mem

void setup_io()
{

   /* open /dev/mem */
   if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
      printf("can't open /dev/mem \n");
      exit (-1);
   }
   // Allocate MAP block
   if ((gpio_mem = malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) {
      printf("allocation error \n");
      exit (-1);
   }
   // Make sure pointer is on 4K boundary
   if ((unsigned long)gpio_mem % PAGE_SIZE)
     gpio_mem += PAGE_SIZE - ((unsigned long)gpio_mem % PAGE_SIZE);
   // Now map it
   gpio_map = (unsigned char *)mmap(
      (caddr_t)gpio_mem,
      BLOCK_SIZE,
      PROT_READ|PROT_WRITE,
      MAP_SHARED|MAP_FIXED,
      mem_fd,
      GPIO_BASE
   );
   if ((long)gpio_map < 0) {
      printf("mmap error %d\n", (int)gpio_map);
      exit (-1);
   }
   gpio = (volatile unsigned *)gpio_map;
}
void setup\u io()
{
/*open/dev/mem*/
如果((mem_fd=open(“/dev/mem”,O_RDWR | O_SYNC))<0){
printf(“无法打开/dev/mem\n”);
出口(-1);
}
//分配地图块
如果((gpio_mem=malloc(块大小+(页面大小-1)))==NULL){
printf(“分配错误\n”);
出口(-1);
}
//确保指针位于4K边界上
if((无符号长)gpio\U内存%PAGE\U大小)
gpio_mem+=页面大小-((无符号长)gpio_mem%页面大小);
//现在绘制地图
gpio_映射=(无符号字符*)mmap(
(caddr_t)gpio_成员,
块大小,
保护读,保护写,
地图共享|地图固定|,
各位,
GPIO_基地
);
如果((长)gpio_映射<0){
printf(“mmap错误%d\n”,(int)gpio\u映射);
出口(-1);
}
gpio=(易失性无符号*)gpio_映射;
}

问题是我如何在不成为超级用户的情况下使用gem?现在,当内存打开时,它会失败。

你能更改/dev/mem上的权限吗?@Fred认为这不是一个好的解决方案。@Fred/dev/mem上的权限已经设置为
crwxrwx 1 root kmem 1,1970年1月1日mem
我理解你说open()失败是因为进程不是root。如果这是正确的,除了允许非根进程为O_RDWR打开内存之外,还能做什么?(添加:或使程序setuid成为root)对不起,我们似乎在付费编辑评论!好的,内存打开时会出现什么故障?