标签: c

在Linux设备驱动程序编程中使用struct inode和struct文件传递数据的原因

我正在学习Linux设备驱动程序的第3.5章,第3版.本节介绍一种检索我们struct inode *inode在open函数中定义的自定义结构的方法:

int scull_open(struct inode *inode, struct file *filp)
{
    struct scull_dev *dev;

    dev = container_of(inode->i_cdev, struct scull_dev, cdev);
    filp->private_data = dev; /* for other methods */

    }
    return 0;          
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,当设备打开时,struct inode *inode表示设备的传递scull_open.然后,dev提取并传递自定义结构,filp->private_data以便其他方法scull_read可以使用它:

ssize_t scull_read(struct file *filp, char _ _user *buf, size_t count,
                loff_t *f_pos)
{
    struct scull_dev *dev = filp->private_data; 
    /* other codes that uses *dev   */
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很好,直到我意识到我们已经struct scull_dev …

c linux inode linux-device-driver linux-kernel

12
推荐指数
2
解决办法
8090
查看次数

C/C++:抛弃挥发性被认为有害吗?

(与这个问题有关,抛弃挥发物是否安全?,但不完全相同,因为该问题与特定实例有关)

是否有过在那里虚掷的情况下volatile被认为是危险的做法?

(一个特定的例子:如果声明了一个函数

void foo(long *pl);
Run Code Online (Sandbox Code Playgroud)

我必须实施

void bar(volatile long *pl);
Run Code Online (Sandbox Code Playgroud)

有()我需要执行栏的一部分来调用foo(PL),然后好像我不能得到这个作为是工作,因为假设由foo的编制()和bar的调用者的编辑制作()不兼容.)


作为推论,如果我有一个volatile变量v,我想打电话给foo(&v)别人的功能void foo(long *pl),那人告诉我这是安全的,我可以调用之前投的指针,我的直觉是要告诉他们,他们错了,因为没有办法保证,void foo(volatile long *pl)如果他们想支持使用volatile变量,他们应该更改声明.我们哪一个是正确的?

c c++ volatile

12
推荐指数
3
解决办法
5426
查看次数

转换指针不会产生左值.为什么?

发布我最有争议的一个回答后在这里,我不敢问几个问题,并最终在我的知识填补一些空白.

为什么不是一种((type_t *) x)被认为是有效左值的表达式,假设它x本身是指针和左值,而不仅仅是某个表达式?

我知道很多人会说"标准不允许它",但从逻辑的角度看它似乎是合理的.标准不允许的原因是什么?毕竟,任何两个指针都具有相同的大小,指针类型只是一个编译时抽象,指示在进行指针运算时应该应用的适当偏移量.

c pointers casting lvalue

12
推荐指数
2
解决办法
3925
查看次数

为什么缩短C名称?

为什么有一个被调用的函数strcat而不是一个被调用的函数stringConcatenation,或者stringConcat或者string_concat类似的函数?为什么有一个clrscr功能,而不是clearScreenclear_screen

它是否与过去几天的源代码大小有关,其中每个字节在过大的软盘上都是值得的?还是程序员固有的懒惰加剧了这种情况?这是一个惯例吗?

c conventions function naming-conventions

12
推荐指数
1
解决办法
1250
查看次数

按位移位以在C中生成所有可能的排列

可能重复:
创建具有特定位数的多个数字

我正在尝试编写一些代码,通过将位移位来将每个可能的数字组合放在一个数组中.

例如,我想找到数组应该包含的3位(最大数字可以是6)的所有可能组合:

000111
001011
001101
001110
010011
010101
010110
011001
011010
011100
100011

等等...

根据我的解释,当最后一个位置为1时,我们将数字移1(x >> 1)并在开始时加1.但是,我不确定如何编写其余的代码.我用C来写这个.

另外 - 据我所知,这是一个colex序列,但是,如果有另一个序列可以给我相同的最终结果(具有约束为N的k位的所有可能组合的数组),我都是耳朵. .

c algorithm combinations bit-manipulation permutation

12
推荐指数
1
解决办法
7280
查看次数

有没有比定时更好的方法来对C程序进行基准测试?

我正在编写一个小程序,必须对一个大型数组(最多400万个文本字符串)进行排序.似乎我在这方面做得很好,因为radixsort和mergesort的组合已经将原始q(uick)排序执行时间减少了不到一半.

执行时间是主要的一点,因为这是我用来我的代码进行基准测试的.

我的问题是:

是否有更好的(即更可靠的)基准测试程序的方式,而不仅仅是执行的时间?它有点工作,但是如果运行两次,相同的程序(运行相同的后台进程)通常具有稍微不同的执行时间.

这有点挫败了检测小改进的目的.一些小的改进可能会增加一个很大的...

提前感谢任何输入!

结果:

我设法让gprof在Windows下工作(使用gcc和MinGW).与我的普通编译器(tcc)相比,gcc表现不佳(考虑执行时间),但它给了我很多洞察力.

c sorting benchmarking

12
推荐指数
1
解决办法
3821
查看次数

如何使用C套接字API侦听所有IPV6地址

我维护GPSD,这是一个广泛部署的开源服务守护进程,可以监控GPS和其他大地测量传感器.它在IPv4和IPv6上侦听端口2947上的客户端应用程序连接.为了安全和隐私,它通常只监听环回地址,但守护进程有一个-G选项,用于使其监听任何地址.

问题:-G选项在IPv4中有效,但我无法弄清楚如何使其与IPv6一起使用.应该基于各种教程示例工作的方法不会产生错误,表明该地址已在使用中.我正在寻求帮助来解决IPv6网络编程经验丰富的人.

相关代码见http://git.berlios.de/cgi-bin/gitweb.cgi?p=gpsd;a=blob;f=gpsd.c;h=ee2156caf03ca23405f57f3e04e9ef306a75686f;hb=HEAD

此代码在IPv4下的-G和非G情况下都能正常运行,因为可以使用netstat -l轻松验证.

现在看看"案例AF_INET6:"之后的第398行.listen_global选项由-G设置; 如果为false,则代码成功.目前有一个以下评论,继承自一个未知的贡献者,如下所示:

/* else */
        /* BAD:  sat.sa_in6.sin6_addr = in6addr_any;
     * the simple assignment will not work (except as an initializer)
     * because sin6_addr is an array not a simple type
     * we could do something like this:
     * memcpy(sat.sa_in6.sin6_addr, in6addr_any, sizeof(sin6_addr));
     * BUT, all zeros is IPv6 wildcard, and we just zeroed the array
     * so really nothing to do here
     */
Run Code Online (Sandbox Code Playgroud)

根据我查找的各种教程示例,分配"sat.sa_in6.sin6_addr = in6addr_any;" (尽管评论)是正确的,它确实编译.但是,使用-G启动时无法声明监听地址已被使用.

作业是"sat.sa_in6.sin6_addr = in6addr_any;" 名义上正确吗?还有什么,如果有的话,我错过了什么?

c ipv6

12
推荐指数
1
解决办法
1万
查看次数

如何在c中使用%运算符表示浮点值

当我在浮点值上使用%运算符时,我得到错误,指出"二进制%的操作数无效(有'浮'和'双')".我只想输入整数值,但数字非常大(不在范围内) int类型)所以为了避免我使用float的不便.有没有办法在这么大的整数值上使用%运算符????

c math

12
推荐指数
3
解决办法
3万
查看次数

我需要什么工具链来交叉编译Clang for iOS

好的,首先我知道这可以在iOS(armv7)上编译,因为我阅读了文档.但是,我找不到合适的工具链.

那么,现在,我已经尝试过哪些工具链:

i686-apple-darwin10-cpp-4.2.1
i686-apple-darwin10-g++-4.2.1
i686-apple-darwin10-gcc-4.2.1
Run Code Online (Sandbox Code Playgroud)

以上交叉编译为x86(我在i386上).工作良好.但我不需要它

arm-apple-darwin10-cpp-4.2.1
arm-apple-darwin10-g++-4.2.1
arm-apple-darwin10-gcc-4.2.1
Run Code Online (Sandbox Code Playgroud)

以上编译很好,但不会像我预期的那样交叉编译到arm,相反,它只是编译到我当前的arch.

我是这个问题的真正初学者,事实上这是我第一次尝试交叉编译.

更新:

以下是我尝试过的命令(这是针对armv6; armv7类似):

配置:

../llvm/configure --host=arm-apple-darwin6 --target=arm-apple-darwin6 
--build=i386-apple-darwin --enable-optimized --disable-debug  
--disable-expensive-checks --disable-doxygen  --disable-threads
Run Code Online (Sandbox Code Playgroud)

env vars:

    export DEVROOT=/Developer/Platforms/iPhoneOS.platform/Developer
export SDKROOT=$DEVROOT/SDKs/iPhoneOS$IOS_BASE_SDK.sdk

export CFLAGS="-arch armv6 -pipe -no-cpp-precomp -isysroot $SDKROOT -miphoneos-version-min=$IOS_DEPLOY_TGT -I$SDKROOT/usr/include/"

    export CPP="$DEVROOT/usr/bin/arm-apple-darwin10-cpp-4.2.1"
export CXX="$DEVROOT/usr/bin/arm-apple-darwin10-g++-4.2.1"
export CXXCPP="$DEVROOT/usr/bin/arm-apple-darwin10-cpp-4.2.1"
export CC="$DEVROOT/usr/bin/arm-apple-darwin10-gcc-4.2.1"
export LD=$DEVROOT/usr/bin/ld
export AR=$DEVROOT/usr/bin/ar
export AS=$DEVROOT/usr/bin/as
export NM=$DEVROOT/usr/bin/nm
export RANLIB=$DEVROOT/usr/bin/ranlib
export LDFLAGS="-L$SDKROOT/usr/lib/"

export CPPFLAGS=$CFLAGS
export CXXFLAGS=$CFLAGS
Run Code Online (Sandbox Code Playgroud)

更新:此交叉编译的目的是使armv7(armv6)库不是命令行工具.

再来一次更新:我使用了以下内容:

CC="$DEVROOT/usr/bin/clang"
CXX="$DEVROOT/usr/bin/clang++"

./llvm/configure --host=i386-apple-darwin --target=armv7-apple-darwin --build=armv7-apple-darwin --enable-optimized --disable-debug --disable-expensive-checks --disable-doxygen  --disable-threads --enable-targets=arm 
Run Code Online (Sandbox Code Playgroud)

我设法checking whether …

c c++ compiler-construction arm cross-compiling

12
推荐指数
1
解决办法
4914
查看次数

如果不存在必需的标志,则编译失败

我有一些传统代码需要传入某些gcc标志.我可以为这些标志添加预处理器检查吗?

例如,假设我需要-fno-strict-aliasing,我可以这样做:

#ifndef _FNO_STRICT_ALIASING
   #error -fno-strict-aliasing is required!
#endif
Run Code Online (Sandbox Code Playgroud)

c c++ gcc

12
推荐指数
1
解决办法
535
查看次数