Articles of Linux操作系统

将数据序列化代码从C ++ linux / mac移植到C ++窗口

我有一个软件框架在mac和linux上编译和运行成功。 我现在试图将其移植到Windows(使用mingw)。 到目前为止,我有软件编译和运行在Windows下,但它不可避免的越野车。 特别是,我有一个阅读macos(或linux)序列化到程序的windows版本(segfaults)的数据的问题。 序列化过程序列化原始variables(长整数,整数,双精度等)的值到磁盘。 这是我正在使用的代码: #include <iostream> #include <fstream> template <class T> void serializeVariable(T var, std::ofstream &outFile) { outFile.write (reinterpret_cast < char *>(&var),sizeof (var)); } template <class T> void readSerializedVariable(T &var, std::ifstream &inFile) { inFile.read (reinterpret_cast < char *>(&var),sizeof (var)); } 所以为了保存一堆variables的状态,我依次调用每个variables的serializeVariable。 然后再读取数据,调用readSerializedVariable按照保存顺序进行调用。 例如保存: ::serializeVariable<float>(spreadx,outFile); ::serializeVariable<int>(objectDensity,outFile); ::serializeVariable<int>(popSize,outFile); 并阅读: ::readSerializedVariable<float>(spreadx,inFile); ::readSerializedVariable<int>(objectDensity,inFile); ::readSerializedVariable<int>(popSize,inFile); 但在Windows中,这个序列化数据的读取失败。 我猜测,Windows序列化数据有点不同。 我想知道是否有一种方法可以修改上面的代码,以便保存在任何平台上的数据可以在任何其他平台上读取…任何想法? […]

面对一个错误“*** glibc检测***免费():无效的下一个大小(快)”

请参阅MSO问题可能出现的重复列表 – C内存分配和溢出边界以获取有关密切相关问题的信息。 开发环境:CentOS 4.7,Kdevelop 3.1.1,gcc 3.4.6 我运行一个Javatesting客户端,使用JNI加载一个C ++共享库。 我的应用程序中有三个组件, Java客户端 C ++共享库,它充当一个JNI包装器。 (我会称之为“wrapperlibrary”) 包含业务对象的C ++共享库。 (我会称之为“businesslibrary”) 当我运行客户端时,我经常面对一个错误, *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 *** 。 这个错误大约需要10到11次,然后运行应用程序。 在我的Java客户端中,我首先按如下方式在静态ctor中加载所需的C ++库, static { System.Load("/root/Desktop/libs/businesslibrary"); System.out.println("business library loaded"); System.Load("/root/Desktop/libs/wrapperlibrary"); System.out.println("wrapper library loaded"); } “业务库加载”的语句被打印在控制台上,但之后错误*** glibc…来。 在包装库的项目设置中,业务库被指定为从属库。 所以,即使我省略了加载businesslibrary的调用, static { System.Load("/root/Desktop/libs/wrapperlibrary"); System.out.println("wrapper library loaded"); } […]

Java Process的常驻内存使用量(RSS)不断增长

我们最近对我们的生产系统的观察告诉我们,我们的Java容器的常驻内存使用量增长了。 针对这个问题,我们做了一些调查,理解为什么java进程比堆栈+线程栈+共享对象+代码caching+等消耗更多的内存,使用一些本地工具,如pmap。 因此,我们发现一些由本地进程(可能是使用malloc / mmap)分配的64M内存块(成对): 0000000000400000 4K rx– /usr/java/jdk1.7.0_17/bin/java 0000000000600000 4K rw— /usr/java/jdk1.7.0_17/bin/java 0000000001d39000 4108K rw— [ anon ] 0000000710000000 96000K rw— [ anon ] 0000000715dc0000 39104K —– [ anon ] 00000007183f0000 127040K rw— [ anon ] 0000000720000000 3670016K rw— [ anon ] 00007fe930000000 62876K rw— [ anon ] 00007fe933d67000 2660K —– [ anon ] […]

C ++标准库和Boehm垃圾收集器

我想在Linux / AMD64 / Debian上用GCC 4.6开发一个multithreading的C ++应用程序(最终大部分的C ++代码将由应用程序本身生成,可以被视为一种高级的域特定语言)可能是最新的C ++ 11标准)。 我真的想用Boehm的保守的垃圾收集器来分配所有的堆,因为我想用new(GC)分配,而且从不打扰delete 。 我假设Boehm的GC工作得很好。 使用C ++(而不是C)的主要动机是C ++标准库提供的所有algorithm和集合std::map … std::vector 。 Boehm的GC提供了一个gc_allocator<T>模板(在其文件gc / gc_allocator.h中)。 我应该重新定义operator ::new作为Boehm的吗? 或者我应该使用显式的分配器模板参数设置为一些gc_allocator所有集合模板? 我不明白第二个模板参数(分配器)对std :: vector的作用吗? 是用来分配vector内部数据还是分配每个单独的元素? 那么std::string -s呢? 如何使他们的数据GC分配? 我应该有我自己的string,使用basic_string模板与gc_allocator ? 有没有办法让GC_malloc_atomic而不是GC_malloc分配的char内部数组? 或者你build议不要使用Boehm GC与g ++编译的应用程序? 问候。

listen()忽略积压参数?

我有以下问题: 我有sockfd = socket(AF_INET, SOCK_STREAM, 0) 当我build立并绑定套接字(比如sockfd.sin_port = htons(666) )后,我立刻做了: listen(sockfd, 3); sleep(50); // for test purposes 我睡了50秒来testingbacklog参数,这似乎被忽略了,因为我可以在端口666上build立超过3次的连接。 *:我的意思是,我从每个从客户端发送的第N个SYN(n> 3)获得一个syn / ack,并放入监听队列中,而不是被丢弃。 什么可能是错的? 我读过listen(2)和tcp(7)的man页面,发现: Linux套接字上的backlog参数的行为随Linux 2.2而改变。 现在它指定了等待被接受的完全build立的套接字的队列长度,而不是不完整的连接请求的数目。 不完整套接字队列的最大长度可以使用/ proc / sys / net / ipv4 / tcp_max_syn_backlog来设置。 当启用syncookies时,没有逻辑最大长度,这个设置被忽略。 有关更多信息,请参阅tcp(7)。 ,但即使使用sysctl -w sys.net.ipv4.tcp_max_syn_backlog=2和sysctl -w net.ipv4.tcp_syncookies=0 ,我仍然得到相同的结果! 我一定是错过了一些东西,或者完全误解了listen()的积压目的。

如何等待非subprocess退出

对于subprocess,可以使用wait()和waitpid()函数暂停当前进程的执行,直到subprocess退出。 但是这个函数不能用于非subprocess。 是否还有另一个function,可以等待任何进程退出?

awk模式可以匹配多行吗?

我有一些复杂的日志文件,我需要编写一些工具来处理它们。 我一直在玩awk,但我不确定awk是否是正确的工具。 我的日志文件是OSPF协议解码的打印输出,其中包含各种协议包的文本日志及其内容,以及用它们的值标识的各种协议字段。 我想处理这些文件,只打印出与特定pkts有关的日志的某些行。 每个pkt日志可以包含该pkt条目的不同数量的行。 awk似乎能够处理与模式匹配的单行。 我可以find所需的pkt,但然后我需要匹配下面的行中的模式,以确定它是否是我想要打印的pkt。 另一种方法来看待这个问题,我想隔离日志文件中的几行,并根据几行模式匹配打印出特定pkt的细节。 由于awk似乎是基于行的,我不确定这是否是最好的工具。 如果awk可以做到这一点,它是如何做到的? 如果没有,有哪些工具可以使用这个build议?