小编kum*_*umo的帖子

为什么两个设备共享相同的主要次要设备号?

我正在阅读" Linux设备驱动程序,第3版 ",并发现了一些我无法理解的东西.

在第3.2章中,作者说:

传统上,主要编号标识与设备关联的驱动程序.内核使用次要编号来确定要引用的设备.

然后我尝试了"ls -l/dev"来看一看,我发现有些不寻常:

brw-rw----  1 root disk      1,   1 2011-08-23 23:52 ram1
brw-rw----  1 root disk      1,   2 2011-08-23 23:52 ram2
brw-rw----  1 root disk      1,   3 2011-08-23 23:52 ram3
brw-rw----  1 root disk      1,   4 2011-08-23 23:52 ram4
brw-rw----  1 root disk      1,   5 2011-08-23 23:52 ram5
...
crw-r-----  1 root kmem      1,   1 2011-08-23 23:52 mem
crw-r-----  1 root kmem      1,   4 2011-08-23 23:52 port
crw-rw-rw-  1 root root      1,   3 2011-08-23 23:52 null …
Run Code Online (Sandbox Code Playgroud)

linux device-driver

6
推荐指数
1
解决办法
1536
查看次数

C puzzle ...如何将可变参数传递给宏?

我被困在这里......

#include <stdio.h>

#define DBG_LVL(lvl, stmt) \
do{ \
    if(lvl>1)  printf stmt; \
}while(0)

#define DBG_INFO(stmt)   DBG_LVL(1, stmt)
#define DBG_ERROR(stmt)  DBG_LVL(2, stmt)


int main()
{
    DBG_INFO(("hello, %s!\n", "world"));
    DBG_ERROR(("crazy, %s!\n", "world"));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,上面的代码使用"DBG_INFO"或"DBG_ERROR"等宏来控制调试信息级别.

现在由于某种原因,我必须DBG_LVL()用新功能替换.

void myprint(int lvl, const char * format, ...);
Run Code Online (Sandbox Code Playgroud)

唯一的区别是调试级别被视为其fisrt参数.我刚在想:

#define DBG_LVL(lvl, stmt) myprint(lvl, stmt)
Run Code Online (Sandbox Code Playgroud)

当然它失败了,因为"stmt"表达式包括括号.然后我用Google搜索试图找到剥离括号的方法,似乎没有什么可以帮助.我也尝试了一些技巧将参数传递给"stmt",仍然失败...... :(

你能帮助我吗?

c variadic-functions c-preprocessor

5
推荐指数
1
解决办法
1907
查看次数

一个小的c程序导致"内存损坏"

我写了一个小程序来打印给定字母集的完整排列.当集合小于26时它运行良好,并且在26或更多时崩溃.崩溃日志说:

*** Error in `./a.out': malloc(): memory corruption (fast): 0x0000000000cd56a0 ***
Run Code Online (Sandbox Code Playgroud)

经过几个小时的调试,仍然不知道根本原因.

PS:如果我删除了释放tmp_done和tmp_todo的这两行,它就不会崩溃,但结果仍然很奇怪,一个意外的"!" 发生在结果中.

abcdefghijklmnopqtyuzxwr!sv
abcdefghijklmnopqtyuzxwr!vs
abcdefghijklmnopqtyuzxws!rv
abcdefghijklmnopqtyuzxws!vr
abcdefghijklmnopqtyuzxwv!rs
Run Code Online (Sandbox Code Playgroud)

这是来源:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>


static void __permutation1(char * done, char * todo)
{
    int i = 0;

    for(i=0; i<strlen(todo); i++)
    {
        if (1 == strlen(todo))
        {
            printf("%s%s\n", done, todo); break;
        }
        char * tmp_todo = strdup(todo);
        char * tmp_done = strdup(done);
        char s[2] = {todo[i], 0};

        strcat(tmp_done, s);
        memmove(tmp_todo+i, tmp_todo+i+1, strlen(tmp_todo)-i); // null termincated!
        __permutation1(tmp_done, tmp_todo); …
Run Code Online (Sandbox Code Playgroud)

c debugging

5
推荐指数
1
解决办法
482
查看次数