Articles of c + +

在Linux中将物理地址转换为虚拟并读取其内容

我有Linux和我有一个物理地址:(即0x60000000)。 我想从用户空间的Linux程序读取这个地址。 这个地址可能在内核空间中。

在gcc中有作为内置macros的非保留标识符的原因是什么?

今天我偶然发现了一个相当有趣的编译器错误: int main() { int const unix = 0; // error-line return unix; } 给gcc 4.3.2(是的,古老的)以下消息: error: expected unqualified-id before numeric constant 这绝对是相当混乱。 幸运的是,铿锵声(3.0)是一个更有帮助(像往常一样): error: expected unqualified-id int const unix = 0 ^ <built-in>:127:14: note: expanded from: #define unix 1 ^ 我当然没有想到unix ,它既不是大写字母,也不是从下划线开始,成为一个macros,特别是一个内置macros。 我检查了gcc中的预定义macros,并且有2个(在我的平台上)使用“非保留”符号: $ g++ -E -dM – < /dev/null | grep -v _ […]

通过链接两个相同的库来解决循环依赖关系?

我们有一个代码库分解成静态库。 不幸的是,图书馆有循环依赖; 例如, libfoo.a依赖于libbar.a ,反之亦然。 我知道处理这个“正确”的方法是使用链接器的–start-group和–end-group选项,如下所示: g++ -o myApp -Wl,–start-group -lfoo -lbar -Wl,–end-group 但是在我们现有的Makefiles中,这个问题通常是这样处理的: g++ -o myApp -lfoo -lbar -lfoo (想象一下,这扩展到了20个具有复杂相关性的库。) 我已经经历了我们的Makefiles把第二种forms改为第一种,但是现在我的同事们在问我为什么…而除了“因为它更干净”和模糊的感觉,其他forms是有风险的,所以我没有有一个很好的答案。 那么,多次链接同一个库会产生一个问题? 例如,如果相同的.o被拉两次,链接是否会失败并带有多重定义的符号? 还是有任何风险,我们可以结束两个相同的静态对象的副本,创造微妙的错误? 基本上,我想知道链接时间或运行时间失败的可能性多次链接同一个库。 如果是的话,如何触发它们。 谢谢。

在linux下编译leveldb c ++程序错误?

我已经安装leveldb在我的主目录~/local 。 [~/temp/leveldb-1.15.0] $ make [~/temp/leveldb-1.15.0] $ cp -av libleveldb.* $HOME/local/lib/ [~/temp/leveldb-1.15.0] $ cp -av include/leveldb $HOME/local/include/ 我的c ++程序是这样的: #include <assert.h> #include <iostream> #include "leveldb/db.h" using namespace std; int main(int argc,char * argv[]) { leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; std::string dbpath = "tdb"; leveldb::Status status = leveldb::DB::Open(options, dbpath, &db); assert(status.ok()); std::string key1 = […]

如何获得Linux中的C / C + +的内存访问types

可能重复: 有没有比parsing/ proc / self / maps找出内存保护更好的方法? 我有一个指针,我想检查引用的内存是否可读,可写和/或可执行。 我怎样才能做到这一点?

Linux下的串口编程

我想用电路板上的RS232端口与PC通信。 我知道我可以使用“dev / ttyS0”来达到这个目的。 我可以使用write()函数打开和写入数据到PC。 但问题是我无法从“dev / ttyS0”读取。 每次我使用阅读function,我得到“资源暂时不可用”。 你能告诉我如何解决这个问题吗? 这是我的代码: #include <stdio.h> #include <string.h> #include <fcntl.h> #include <termios.h> #include <unistd.h> int main() { int n = 0, fd = 0, bytes = 0; char ch = 0; char buffer[10], *bufPtr; int nBytes = 0, tries = 0, x = 0; struct termios term; fd […]

从struct sk_buff提取数据

我试图从struct sk_buff提取数据,但没有收到我期待的输出。 有问题的帧是34字节; 包含8字节(实验协议)头的14字节以太网报头: struct monitoring_hdr { u8 version; u8 type; u8 reserved; u8 haddr_len; u32 clock; } __packed; 在这个头之后,有两个可变长度的硬件地址(它们的长度由上面的haddr_len字段决定)。 在这个例子中,它们都是6个字节长。 以下代码正确地提取标题(结构),但不是以下两个MAC地址。 发件人方面: … skb = alloc_skb(mtu, GFP_ATOMIC); if (unlikely(!skb)) return; skb_reserve(skb, ll_hlen); skb_reset_network_header(skb); nwp = (struct monitoring_hdr *)skb_put(skb, hdr_len); /* … Set up fields in struct monitoring_hdr … */ memcpy(skb_put(skb, dev->addr_len), src, dev->addr_len); memcpy(skb_put(skb, […]

伪terminal的使用 – C

我使用特定的会话编号创build了一个pThread 。 如果pThread产生了,我试着让另一个进程运行使用openpty启动的伪terminal。 这是代码的一部分: if (openpty(&(numa_pst[session][0]),&(numa_pst[session][1]), NULL, NULL, NULL) != 0) { int err_code = errno; sprintf (line_temp, "*** ERROR: numa openpty failed with:\n%s\n", strerror(err_code)); } session = 0; int* pi = calloc(sizeof(int), 1); *pi = session; if (pthread_create(&system_wideThread[session], 0, system_wider, (void*)pi)) { int err_code = errno; sprintf (line_temp, "*** ERROR: System-wide thread spawn failed […]

我想从COM端口连续接收数据,同时要写入文件

我想读取串行COM端口并将数据写入LINUX中的文件。 其实我是从其他电脑的超级terminal发送数据。 问题是没有while循环,我只能写一行。 但while(1)循环,我不能写任何文件。 否则我必须发送BIG文件,然后应用程序退出/终止并写入文件。 我的应用程序应该写入数据(可能是2行或任何东西); 之后它必须等待下一个数据。 所以请帮我解决….. 这是我的代码 ========================================= #include <termios.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/signal.h> #include <sys/types.h> #include <assert.h> #include <string.h> #include <time.h> #define BAUDRATE B115200 #define MODEMDEVICE "/dev/ttyS0" #define _POSIX_SOURCE 1 /* POSIX compliant source */ #define FALSE 0 #define TRUE 1 volatile int STOP=FALSE; void signal_handler_IO (int status); […]

使用C ++在Linux中计算磁盘读/写

我的要求是通过总磁盘读/写操作(或读/写数据量)来分析当前进程磁盘读/写操作。 我需要先抽取样品,并在这两者之间绘制图表。 我需要在c ++中的Linux(Ubuntu 12.10)上执行此操作。 有任何可用于此任务的API /工具吗? 我发现一个工具,即iotop但我不知道如何使用这个当前进程与系统的广泛使用。 谢谢