Articles of c + +

调用clock()时出现分段错误

我想了解使用下面的程序以编程方式caching的影响。 我正在与代码段错误。 我使用GDB(用-g -O0编译),发现它是分段错误 start = clock() (first occourance) 难道我做错了什么? 代码对我来说看起来很好。 有人能指出这个错误吗? #include <stdio.h> #include <sys/time.h> #include <time.h> #include <unistd.h> #define MAX_SIZE (16*1024*1024) int main() { clock_t start, end; double cpu_time; int i = 0; int arr[MAX_SIZE]; /* CPU clock ticks count start */ start = clock(); /* Loop 1 */ for (i = 0; […]

如何从Ocaml使用自己的共享库.so调用C ++代码?

我需要build立一个调用共享对象(Linux下的.so)的Ocaml / C ++模块, 只要编译一个简单的Ocaml / C ++存根就是一个问题,我pipe理这个东西,但是当我需要将.so和ocamlmklib或者ocamlopt连接起来的时候,它会失败 我在gcc 4.5下工作(c ++ 0x) 共享对象的文件: hello.hpp #include <iostream> #include <string> using namespace std; class HelloApplication { public : HelloApplication(); ~HelloApplication(); void say(string s); }; typedef HelloApplication *(*create_hello)(); hello.cpp: #include "hello.hpp" HelloApplication::HelloApplication(){} HelloApplication::~HelloApplication(){} void HelloApplication::say(string s) { cout << "Hello : " << s << endl; } extern […]

在C预处理器中避免双重macros观replace

这是一个简单的小C程序,让我困惑了一会儿: #include <stdio.h> #define STR1(x) #x #define STR(x) STR1(x) int main(void) { printf("%s\n", STR(MYDEF)); } 这只是使用标准的string化双定义技术将stringMYDEF #define的值打印出来。 使用gcc -DMYDEF=abc prog.c编译(在Linux上)运行结果,并不奇怪,它打印出'abc'。 但是改变gcc -DMYDEF=linux prog.c的值,打印的结果不是'linux',而是'1'。 所以这让我困惑了一下,但是当然是因为gcc(在Linux上)发现了一个名为'linux'的内置的#define,其值为'1',而STR(x)macros最后将MYDEF扩展为“linux”,然后将linux扩展为“1”。 在我真正的程序中(这比上面的小testing要复杂得多),我用一种不同的(可能更好的)方式来处理这个事情,但是这让我好奇……是否有一个简单的小macros技术可以避免这个双重replace,并使程序打印出'linux'? 我知道我可以添加一个-U或#undef的Linux,但是这感觉有点笨拙。 我以为所有内置的#define都以下划线(通常是双下划线)开头,但我猜不是。

RedHat Enterprise Linux 5.3以上不支持sem_timedwait?

我们在RedHat Enterprise Linux系统上看到了使用pthreads sem_timedwait的奇怪行为。 只有版本5.3以上才会出现。 当我们用sem_init在后台线程上创build信号量时,不会返回任何错误。 当我们执行sem_timedwait时,我们立即返回errno = 38(ENOSYS),表示不支持。 如果我们在主线程上做同样的事情,它会按预期工作,并且sem_timedwait没有错误。 我们在RHEL 5.2或之前没有看到它。 我们试着用gcc 3.2.3和4.1.2编译我们的代码,并得到相同的结果,所以它似乎是一个运行时问题。 所以,我的问题(最后;) 1)有没有人看过这个? 2)是RHEL 5.3以上的已知问题吗? 3)我们正在使用sem_timedwait睡一个单一的线程。 在Linux上有什么替代方法可以做同样的事情? 如果这是另一个问题的重复,请告诉我。 我看了,但找不到一个相同的问题,只是类似的OSX,这不是我们正在使用的。 谢谢,pxb 更新:刚刚做了更多的testing,结果如下: 如果我在RHEL5.4盒子(使用-L / usr / lib64和-lstdc ++ -lrt)上使用gcc 4.1.2进行64位构build,并在64位安装的RHEL5上运行, 如果我在RHEL5.1盒子(使用-L / usr / lib和-lstdc ++ -lrt)上使用gcc 4.1.2来构build32位版本,并在一个完全相同的64位RHEL5盒子上运行它,我们得到ENOSYS错误sem_timedwait 所以,看起来RHEL5.4(和看似RHEL5.3)上的64位和32位运行库是有区别的。 唯一的区别是32位和64位构build分别完成了RHEL5.1和RHEL5.4盒。

epoll是否保留了fd的注册顺序?

我正在玩Linux系统调用,我发现了epoll一些方面,这是不清楚的。 说,我创build一个epoll实例: epollfd = epoll_create(50); 接下来,我在for -loop中注册了50个文件描述符: for(i=0; i<50; i++){ // open file "file-i".txt // construct epoll_event // register new file descriptor with epoll_ctl(epollfd, EPOLL_CTL_ADD … 现在我们有50个文件,准备行动(读或写 – 无所谓)。 我们将MAX_EVENTS设置为3: #define MAX_EVENTS 3 … struct epoll_event events[MAX_EVENTS] … epoll_wait(epollfd, events, MAX_EVENTS, -1) 所有这50个文件都准备好了,我们只问了其中的3个。 哪些文件将在events数组中? [1,2,3] – 前3个文件,以便他们被添加到epoll [48,49,50] – 最后3个文件,以便他们被添加到epoll [34,7,15] – 随机3个文件 任何其他选项 谢谢。

在使用分叉时如何映射内存?

我是新来的“fork()”,我到处读到,当一个fork()被调用当前(调用)进程的确切副本开始。现在,当我运行下面的代码,应该有两个不同的进程,分配给他们的variables和函数的内存位置。 #include<stdio.h> int i=10; int pid; int main(){ if((pid=fork())==0){ i++;//somewhere I read that separate memory space for child is created when write is needed printf("parent address= %p\n",&i);// this should return the address from parent's memory space }else{ i++; i++; printf("child address= %p\n",&i);// this should return the address of child's memory space } wait(0); return(0); } […]

在不使用Epoll的Linux上升级Asio

我的印象是,boost :: asio会默认使用epoll设置,而不是select实现,但是在运行一些testing之后,看起来像我的设置正在使用select。 操作系统:RHEL 4 内核:2.6 GCC:3.4.6 我写了一个小testing程序来validation哪个反应器头被使用,看起来像使用select反应器而不是epoll反应器。 #include <boost/asio.hpp> #include <string> #include <iostream> std::string output; #if defined(BOOST_ASIO_EPOLL_REACTOR_HPP) int main(void) { std::cout << "you have epoll enabled." << std::endl; } #elif defined(BOOST_ASIO_DETAIL_SELECT_REACTOR_HPP) int main(void) { std::cout << "you have select enabled." << std::endl; } #else int main(void) { std::cout << "this shit is confusing." << […]

Big Endian和Little Endian支持字节sorting

我们需要支持3个硬件平台–Windows(小端)和Linux Embedded(大端和小端)。 我们的数据stream取决于它使用的机器,数据需要分解成位域。 我想写一个macros(如果可能的话)来抽象出细节。 在Linux上,我可以使用bswap_16 / bswap_32 / bswap_64进行Little Endian转换。 但是,我无法在我的Visual C ++包含中find这个。 是否有两个平台(Windows和Linux)的通用内置? 如果没有,那么我可以在Visual C ++中使用什么来做字节交换(除了自己写的 – 希望一些机器优化的内置)? 谢谢。

Linux fork / exec到同一个目录下的应用程序

是否有一个exec变体,将使用当前的应用程序目录来定位目标程序? 我正在使用C ++和Qt来实现“最后的沟渠”错误报告系统。 使用Google Breakpad ,我可以创build一个小型转储并直接执行到一个处理程序。 因为我的应用程序处于不稳定状态,所以我只想使用最小的依赖关系来分叉并启动一个单独的error handling过程。 错误报告应用程序将被部署在与应用程序可执行文件相同的目录中。 我很不熟悉fork和exec选项,并且没有find包含searchpath中当前应用程序目录的exec选项。 这是我到目前为止: static bool dumpCallback(const char* /*dump_path*/, const char* /*minidump_id*/, void* /*context*/, bool succeeded) { pid_t pid = fork(); if (pid == 0) { // This is what I would *like* to work. const char* error_reporter_path = "error_reporter"; // This works, but requires hard-coding the entire […]

X86 64位汇编Linux'Hello World'连接问题

我试图跟进这个线程 ,不幸的是不能解决我的问题。 我试图运行的代码如下所示: ; File hello.asm section .data msg: db "Hello World!",0x0a,0 section .text global main extern printf main: push rbp mov rbp, rsp lea rdi, [msg] ; parameter 1 for printf xor eax, eax ; 0 floating point parameter call printf xor eax, eax ; returns 0 pop rbp ret 我的系统是debian stretch: $ uname […]