C 从ruby访问系统资源
我正在为Hitachi-44780库为Raspberry Pi编写ruby包装。库本身是用C编写的。 我有以下代码试图打开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
/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)对不起,我们似乎在付费编辑评论!好的,内存打开时会出现什么故障?