Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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程序中以秒为单位打印CMOS时间?_C_Linux - Fatal编程技术网

如何在C程序中以秒为单位打印CMOS时间?

如何在C程序中以秒为单位打印CMOS时间?,c,linux,C,Linux,我写了一个小程序,它实际上是从linux源代码中提取出来的。请找到我的示例代码 #include <stdio.h> #define CMOS_READ(addr) ({ \ outb_p(0x80|addr,0x70); \ inb_p(0x71); \ }) #define outb_p(value,port) \ __asm__ ("outb %%al,%%dx\n" \ "\tjmp 1f\n" \ "1:\

我写了一个小程序,它实际上是从linux源代码中提取出来的。请找到我的示例代码

#include <stdio.h>

#define CMOS_READ(addr) ({ \
outb_p(0x80|addr,0x70); \
inb_p(0x71); \
})

#define outb_p(value,port) \
__asm__ ("outb %%al,%%dx\n" \
                "\tjmp 1f\n" \
                "1:\tjmp 1f\n" \
                "1:"::"a" (value),"d" (port))

#define inb_p(port) ({ \
unsigned char _v; \
__asm__ volatile ("inb %%dx,%%al\n" \
        "\tjmp 1f\n" \
        "1:\tjmp 1f\n" \
        "1:":"=a" (_v):"d" (port)); \
_v; \
})

#define outb(value,port) \
__asm__ ("outb %%al,%%dx"::"a" (value),"d" (port))


#define inb(port) ({ \
unsigned char _v; \
__asm__ volatile ("inb %%dx,%%al":"=a" (_v):"d" (port)); \
_v; \
})

int main(void)
{
        int val = 0;
        val  = CMOS_READ(0);
        printf("val = %d", val);
        return 0;
}
#包括
#定义CMOS_读取(addr)({\
输出p(0x80地址,0x70)\
inb_p(0x71)\
})
#定义输出(值、端口)\
__asm_uu(“outb%%al,%%dx\n”\
“\tjmp 1f\n”\
“1:\tjmp 1f\n”\
“1::“a”(值),“d”(端口))
#定义inb_p(端口)({\
无符号字符v\
__asm\uuuuvolatile(“inb%%dx,%%al\n”\
“\tjmp 1f\n”\
“1:\tjmp 1f\n”\
“1::”=a”(_v):“d”(端口)\
_五,\
})
#定义outb(值、端口)\
__asm_uuu(“outb%%al,%%dx”:“a”(值),“d”(端口))
#定义inb(端口)({\
无符号字符v\
__asm_uuuuuuvolatile(“inb%%dx,%%al”:“=a”(v):“d”(端口))\
_五,\
})
内部主(空)
{
int-val=0;
val=CMOS_读取(0);
printf(“val=%d”,val);
返回0;
}
它编译得很好,但在执行时会出现seg错误。

有人能指导我吗?

您没有访问CMOS I/O端口的权限。您需要使用CAP_SYS_RAWIO(通常作为root用户运行,但也可以使用文件功能)并调用以请求访问CMOS I/O端口


另外,
定义了I/O访问宏,因此您不需要自己定义它们。

您没有访问CMOS I/O端口的权限。您需要使用CAP_SYS_RAWIO(通常作为root用户运行,但也可以使用文件功能)并调用以请求访问CMOS I/O端口


另外,
定义了I/O访问宏,因此您不需要自己定义它们。

这更像是一个汇编程序而不是C程序。用户程序不能直接访问I/O端口,这是内核领域。SEGFAULT的意思正是:你访问了一个不允许访问的段,这是你的错。这更像是一个汇编程序而不是一个C程序。用户程序不能直接访问I/O端口,这是内核领域。您的SEGFAULT的意思正是:您访问了一个不允许访问的段,这是您的错误。