我正在学习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 …
(与这个问题有关,抛弃挥发物是否安全?,但不完全相同,因为该问题与特定实例有关)
是否有过在那里虚掷的情况下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变量,他们应该更改声明.我们哪一个是正确的?
发布我最有争议的一个回答后在这里,我不敢问几个问题,并最终在我的知识填补一些空白.
为什么不是一种((type_t *) x)被认为是有效左值的表达式,假设它x本身是指针和左值,而不仅仅是某个表达式?
我知道很多人会说"标准不允许它",但从逻辑的角度看它似乎是合理的.标准不允许的原因是什么?毕竟,任何两个指针都具有相同的大小,指针类型只是一个编译时抽象,指示在进行指针运算时应该应用的适当偏移量.
为什么有一个被调用的函数strcat而不是一个被调用的函数stringConcatenation,或者stringConcat或者string_concat类似的函数?为什么有一个clrscr功能,而不是clearScreen或clear_screen?
它是否与过去几天的源代码大小有关,其中每个字节在过大的软盘上都是值得的?还是程序员固有的懒惰加剧了这种情况?这是一个惯例吗?
可能重复:
创建具有特定位数的多个数字
我正在尝试编写一些代码,通过将位移位来将每个可能的数字组合放在一个数组中.
例如,我想找到数组应该包含的3位(最大数字可以是6)的所有可能组合:
000111 001011 001101 001110 010011 010101 010110 011001 011010 011100 100011
等等...
根据我的解释,当最后一个位置为1时,我们将数字移1(x >> 1)并在开始时加1.但是,我不确定如何编写其余的代码.我用C来写这个.
另外 - 据我所知,这是一个colex序列,但是,如果有另一个序列可以给我相同的最终结果(具有约束为N的k位的所有可能组合的数组),我都是耳朵. .
我正在编写一个小程序,必须对一个大型数组(最多400万个文本字符串)进行排序.似乎我在这方面做得很好,因为radixsort和mergesort的组合已经将原始q(uick)排序执行时间减少了不到一半.
执行时间是主要的一点,因为这是我用来对我的代码进行基准测试的.
我的问题是:
是否有更好的(即更可靠的)基准测试程序的方式,而不仅仅是执行的时间?它有点工作,但是如果运行两次,相同的程序(运行相同的后台进程)通常具有稍微不同的执行时间.
这有点挫败了检测小改进的目的.一些小的改进可能会增加一个很大的...
提前感谢任何输入!
结果:
我设法让gprof在Windows下工作(使用gcc和MinGW).与我的普通编译器(tcc)相比,gcc表现不佳(考虑执行时间),但它给了我很多洞察力.
我维护GPSD,这是一个广泛部署的开源服务守护进程,可以监控GPS和其他大地测量传感器.它在IPv4和IPv6上侦听端口2947上的客户端应用程序连接.为了安全和隐私,它通常只监听环回地址,但守护进程有一个-G选项,用于使其监听任何地址.
问题:-G选项在IPv4中有效,但我无法弄清楚如何使其与IPv6一起使用.应该基于各种教程示例工作的方法不会产生错误,表明该地址已在使用中.我正在寻求帮助来解决IPv6网络编程经验丰富的人.
此代码在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;" 名义上正确吗?还有什么,如果有的话,我错过了什么?
当我在浮点值上使用%运算符时,我得到错误,指出"二进制%的操作数无效(有'浮'和'双')".我只想输入整数值,但数字非常大(不在范围内) int类型)所以为了避免我使用float的不便.有没有办法在这么大的整数值上使用%运算符????
好的,首先我知道这可以在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 …
我有一些传统代码需要传入某些gcc标志.我可以为这些标志添加预处理器检查吗?
例如,假设我需要-fno-strict-aliasing,我可以这样做:
#ifndef _FNO_STRICT_ALIASING
#error -fno-strict-aliasing is required!
#endif
Run Code Online (Sandbox Code Playgroud) c ×10
c++ ×3
algorithm ×1
arm ×1
benchmarking ×1
casting ×1
combinations ×1
conventions ×1
function ×1
gcc ×1
inode ×1
ipv6 ×1
linux ×1
linux-kernel ×1
lvalue ×1
math ×1
permutation ×1
pointers ×1
sorting ×1
volatile ×1