Articles of c + +

在Linux中,如何在现有类中使用device_create?

注意:我现在列出这个问题,我不反对改变实现(例如,将类的创build移动到公共区域),如果它让事情变得更简单,我只是不确定怎么做。 :结束注意 我有两个Linux内核模块,我试图更新他们的/ sys条目。 search谷歌和其他来源,我已经看到了大量的代码沿线: static dev_t MyDev; static struct class *c1; static int __init start_func(void) { … MyDev = MKDEV(nMajor, MINOR_VERSION); register_chrdev_region(MyDev, 1, MODULE_NAME); c1 = class_create(THIS_MODULE, "chardrv"); device_create(c1, NULL, MyDev, NULL, MODULE_NAME); …. 我已经validation了我的第一个模块这个代码的作品,它正确地创build一个: /sys/class/chardrv/<MODULE_NAME> 条目。 我想知道的是如何在现有的类中创build一个设备。 换句话说,我的一个模块创build了这个新的chardrv类,现在我希望我的其他模块也能够在同一个类下注册它的设备。 我不能再次调用class_create()(在第二个模块中),因为“chardrv”类已经存在… 所以我可以运行一个检查来查看/ sys / class / chardrv是否存在,这可以帮助我决定是否需要调用class_create()或不是这个问题。 让我们在这里澄清一些伪代码: if ( path "/sys/class/chardrv" does not exist) […]

从串口读取原始字节

我试图从一个IEC 870-5-101 win32协议模拟器发送的串行端口读取原始字节,使用在Linux 32bit上运行的C编写的程序。 对于像0x00 – 0x7F这样的字节值,它工作正常。 但是对于从0x80到0xAF的值,高位是错误的,例如: 0x7F -> 0x7F //correct 0x18 -> 0x18 //correct 0x79 -> 0x79 //correct 0x80 -> 0x00 //wrong 0xAF -> 0x2F //wrong 0xFF -> 0x7F //wrong 现在挖了两天后,我不知道是什么原因造成的。 这是我的串口configuration: cfsetispeed(&config, B9600); cfsetospeed(&config, B9600); config.c_cflag |= (CLOCAL | CREAD); config.c_cflag &= ~CSIZE; /* Mask the character size bits */ config.c_cflag |= […]

在Android平台上使用dlclose(…)时出现分段错误

在Android上使用dynamic加载API( <dlfcn.h> : dlopen() , dlclose()等)时遇到一些问题。 我正在使用NDK独立工具链(版本8)来编译应用程序和库。 Android版本是2.2.1 Froyo。 这是简单共享库的源代码。 #include <stdio.h> int iii = 0; int *ptr = NULL; __attribute__((constructor)) static void init() { iii = 653; } __attribute__((destructor)) static void cleanup() { } int aaa(int i) { printf("aaa %d\n", iii); } 这里是使用提到的库的程序源代码。 #include <dlfcn.h> #include <stdlib.h> #include <stdio.h> int main() { void *handle; […]

使用多个NIC广播UDP数据包

我正在为Linux中的相机控制器构build一个embedded式系统(不是实时的)。 我有一个问题,让networking做我想做的事情。 该系统有3个网卡,1个100base-T和2个千兆端口。 我将较慢的摄像机连接到摄像机(这是所有支持的),而较快的则是与其他机器的点对点连接。 我试图做的是从相机获取图像,做一些处理,然后使用UDP将其广播到其他每个NIC。 这是我的networkingconfiguration: eth0:addr:192.168.1.200 Bcast 192.168.1.255掩码:255.255.255.0(这是100base -t) eth1:addr:192.168.2.100 Bcast 192.168.2.255掩码:255.255.255.0 eth2:addr:192.168.3.100 Bcast 192.168.3.255 Mask:255.255.255.0 该图像是在专有协议eth0中来的,所以它是一个原始的套接字。 我可以把它播放到eth1或eth2就好了。 但是,当我尝试将它广播到两个,一个接一个,我得到了很多networking打嗝和eth0错误。 我初始化这样的UDP套接字: sock2=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); // Or sock3 sa.sin_family=AF_INET; sa.sin_port=htons(8000); inet_aton("192.168.2.255",&sa.sin_addr); // Or 192.168.3.255 setsockopt(sock2, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)); bind(sock2,(sockaddr*)&sa,sizeof(sa)); sendto(sock2,&data,sizeof(data),0,(sockaddr*)&sa,sizeof(sa)); // sizeof(data)<1100 bytes 我分别为每个套接字执行此操作,并分别调用sendto。 当我做一个或另一个时,没关系。 当我尝试同时发送时,eth0开始收到错误的数据包。 任何想法,为什么发生这种情况? 这是一个configuration错误,有没有更好的方法来做到这一点? 编辑:感谢所有的帮助,我一直在尝试一些东西,并进一步调查。 严格来说,这个问题似乎并不是广播。 我用单播命令replace广播代码,它具有相同的行为。 我想我更好地理解行为,但不是如何解决这个问题。 这是发生了什么事。 在eth0上,我应该每50ms获得一张图片。 当我在eth1(或2)上发送图像时,发送图像大约需要1.5ms。 当我同时发送eth1和eth2时,大约需要45ms,偶尔跳到90ms。 当这超出了50ms窗口,eth0的缓冲区开始build立。 […]

错误编译:linux / module.h:没有这样的文件或目录

我写了一个简单的模块: #define __KERNEL__ #define MODULE #include <linux/kernel.h> #include <linux/module.h> int init_module(void) { printk("Hello, world\n"); return 0; } void cleanup_module(void) { printk("Goodbye\n"); } 并用这个命令编译它: cc -c hello.c 但我得到这个错误: linux/module.h: No such file or directory 有什么build议么? 编辑:我用这个commad: cc -I/usr/src/linux-headers-3.0.0-17-generic/include -c hello.c 它前进了一步,现在我得到这个错误: In file included from /usr/src/linux-headers-3.0.0-17-generic/include/linux/kernel.h:13:0, from hello.c:3: /usr/src/linux-headers-3.0.0-17-generic/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or […]

哪个Linux发行版最适合在虚拟机中开发Mono应用程序?

我一直是Windows用户,现在我需要Linux来使用Mono创build一个应用程序。 哪种Linux发行版最适合我? 我将在虚拟机中使用它。

从文件系统中“读短”,什么时候可以发生?

显然,read(2)系统调用通常可以返回比要求读取的字节更less的字节。 然而,很多程序假设在使用本地文件时,读取(2)永远不会返回比所要求的更less的内容(当然,除非文件更短)。 所以,我的问题是:在Linux上,在哪些情况下可以读取(2)返回小于从打开的文件中读取并且没有遇到EOF并且读取的数量最多只有几千字节时请求的内容? 有些猜测: 可以接收到的信号中断一个这样的读取,但不会使其失败? 不同的文件系统会影响这种行为吗? jffs2有什么特别的吗?

为什么我在这里得到一个SIGABRT?

我有这个代码段,我打开/closures一个文件多次(在一个循环中): for(i=1;i<max;i++) { /* other code */ plot_file=fopen("all_fitness.out","w"); for (j=0;j<pop_size;j++) fprintf(plot_file, "%lf %lf\n",oldpop[i].xreal[0],oldpop[i].obj); fclose(plot_file); /*other code*/ } 我在这里得到一个SIGABRT,跟踪如下: #0 0x001fc422 in __kernel_vsyscall () #1 0x002274d1 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #2 0x0022a932 in *__GI_abort () at abort.c:92 #3 0x0025dee5 in __libc_message (do_abort=2, fmt=0x321578 "*** glibc detected *** %s: %s: 0x%s ***\n") at ../sysdeps/unix/sysv/linux/libc_fatal.c:189 #4 0x00267ff1 […]

在Linux中使用signal.h编译错误

我正在编写一个必须处理信号的shell程序。 我的相关信号处理相关代码如下: #include <signal.h> … #include <sys/types.h> … void installSigactions( int, struct sigaction* ); void handler_function( int signal_id ); … /*define signal table*/ struct sigaction signal_action; /*insert handler function*/ signal_action.sa_handler = handler_function; /*init the flags field*/ signal_action.sa_flags = 0; /*are no masked interrupts*/ sigemptyset( &signal_action.sa_mask ); /*install the signal_actions*/ sigaction( SIGINT, &signal_action, NULL ); 编译给了我以下的警告和错误: […]

关于Cygwin的一些问题(套接字,线程,其他编程和shell问题)

我有一些关于cygwin的问题: 我可以使用Cygwin开发基于套接字的代码吗? Cygwin是否具有与文件描述符一起工作的read()和write()函数? 我可以在Cygwin中使用Pthread库吗? 在Cygwin中编译的代码是否也可以在Linux中进行编译而没有任何改变或者几乎没有变化? Cygwin生成的可执行文件会在Linux中运行吗? 为什么Cygwin在使用pthread库时不需要链接器选项-lpthread ? 为什么在#include <iostream>不需要using namespace std; ? 我可以在Cygwin中使用QT吗? 如果是这样,怎么样? 我可以在其他地方启动我的Linux吗? 用Cygwin分区并使用它? 我可以访问Cygwin中EXT3的其他分区吗?