Articles of c + +

mq_open() – EACCES,权限被拒绝

我试图从一个特权进程创build一个POSIX消息队列(等待稍后读取),然后从一个非特权进程(发送消息)打开这个消息队列,并且后来的mq_open()返回:EACCES。 如果创build进程和打开进程都是特权或两者都没有特权,mq_open将成功。 我检查了mq_open手册,它说EACCES意味着调用者没有权限打开它在指定的模式,但我不知道什么是“指定模式”… 在特权过程中创build成功: struct mq_attr attr; attr.mq_flags = O_RDONLY; attr.mq_maxmsg = 10; attr.mq_msgsize = 1024; attr.mq_curmsgs = 0; mq_open("/myMq", (O_RDONLY| O_CREAT), (S_IRWXU | S_IRWXG | S_IRWXO) /* 777 */, &attr); 在无特权的过程中打开失败: mqd_t mqd; mqd = mq_open("/myMq", (O_WRONLY|O_NONBLOCK)); if ((mqd_t)-1 == mqd) { printf("mq_open %d %s\n", errno, strerror(errno)); } 它给出了错误:mq_open 13权限被拒绝 我正在使用CentOS 6.5 64位 uname […]

如何从用户代码移动鼠标光标?

我的数据来自arduino(从传感器获取)。 我想通过用户程序处理数据(从/ dev / ttyUSB0读取数据后)。 之后,我需要使用程序的输出来控制鼠标光标。 (我现在真的很想避免编写一个内核驱动程序。) 推荐的方法是什么(在Linux环境下)? 也许一个库的顶部X …或一些工具/脚本我可以直接pipe道数据到?

有没有在C / C ++代码中使用mbind的例子?

我想在我的C ++代码中使用mbind()来重新排列4个NUMA域中的虚拟页面,不幸的是我对这个函数是新的: long mbind(void *addr, unsigned long len, int mode, const unsigned long *nodemask, unsigned long maxnode, unsigned flags); 目前,我有这样的东西: mbind(0x0,4611686018424767488,MPOL_BIND,nodemask,maxnode,MPOL_MF_MOVE); 从规格来说,我还不清楚要放什么以及如何放置nodemask和maxnode 。

Apache模块命令parsing器原型

我正在创build一个Apache2模块,遇到一个奇怪的编译问题。 这是我的函数的原型,用于parsing名为“ analytics_ip ”的configuration命令: static const char *apr_cfg_set_analytics_ip(cmd_parms *cmd, void *config, const char *data); 这是包含指向此函数的指针的command_rec结构的数组: static const command_rec apr_cmds[] = { AP_INIT_TAKE1("analytics_ip", apr_cfg_set_analytics_ip, NULL, OR_ALL, ""), { NULL } }; 结构command_rec在头文件http_config.h中声明 typedef struct command_struct command_rec; struct command_struct { /** Name of this command */ const char *name; /** The function to be called when this […]

OpenCV_FOUND为FALSE,因此包“OpenCV”被认为是未find的

我目前有问题,试图让我的cmake看到我的opencv。 我已经安装了opencv,可以运行一些示例问题,并且有一些错误与我在cmake文件中得到的错误相同(当通过terminal运行示例程序时) 我试图改变环境variables的path,如http://answers.opencv.org/question/35125/cmake-linking-error-opencv_found-to-false-ubuntu/ 我的bashrc文件现在看起来像 CMAKE_PREFIX_PATH=/home/durham/Desktop/OpenCV/opencv-2.4.9:$CMAKE_PREFIX_PATH CPATH=/home/durham/Desktop/OpenCV/opencv-2.4.9/include:$CPATH LD_LIBRARY_PATH=/home/durham/Desktop/OpenCV/opencv-2.4.9/lib:$LD_LIBRARY_PATH PATH=/home/durham/Desktop/OpenCV/opencv-2.4.9bin:$PATH PKG_CONFIG_PATH=/home/durham/Desktop/OpenCV/opencv-2.4.9/lib/pkgconfig:$PKG_CONFIG_PATH PYTHONPATH=/home/durham/Desktop/OpenCV/opencv-2.4.9/lib/python2.7/dist-packages:$PYTHONPATH 和/etc/ld.so.conf的内容是 include /etc/ld.so.conf.d/*.conf include /home/durham/Desktop/OpenCV/opencv-2.4.9 我试图运行的cmake文件看起来像这样 cmake_minimum_required(VERSION 2.6) if(POLICY CMP0020) cmake_policy(SET CMP0020 NEW) endif(POLICY CMP0020) SET(CMAKE_VERBOSE_MAKEFILE TRUE) SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/config) ADD_DEFINITIONS(-DQT_THREAD_SUPPORT -D_REENTRANT -DQT_NO_DEBUG -DIQRMODULE) SET(QT_MT_REQUIRED TRUE) find_package(Qt5Widgets) FIND_PACKAGE(OpenCV REQUIRED) IF(NOT DEFINED IQR_INCLUDE_DIR) set (IQR_INCLUDE_DIR "/usr/include/iqr") #default for linux ENDIF(NOT DEFINED IQR_INCLUDE_DIR) IF(NOT EXISTS ${IQR_INCLUDE_DIR}) message(STATUS "not […]

试图通过陷阱标记和陷阱信号处理程序单步执行程序,在vsyscall上崩溃

我想创build一个完整的程序执行指令跟踪,收集一些统计信息等。我首先尝试使用Linux的ptracefunction来逐步通过一个程序(使用这里的教程)。 这创build了两个进程,跟踪的和debugging器,并通过信号进行通信。 我只有每秒16K的指令(在1.6GHz Atom上),所以对于任何不重要的东西来说这太慢了。 我以为通过信号的进程间通信太慢了,所以我试着在执行过程中设置debugging:设置陷阱标志,并创build一个信号处理程序。 当一个软件中断被用来做一个系统调用时,陷阱标志应该被保存,内核将使用它自己的标志 – 所以我想。 但我的程序不知何故被信号SIGTRAP杀死。 这是我设置的: #include <stdio.h> #include <unistd.h> #include <signal.h> int cycle = 0; void trapHandler(int signum) { if (cycle % 262144 == 0) { write(STDOUT_FILENO," trap\n",6); } cycle += 1; } void startTrace() { // set up signal handler signal(SIGTRAP, trapHandler); // set trap flag asm volatile("pushfl\n" "orl […]

数据包套接字只在混杂模式下接收本地stream量

我有socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))创build一个套接字,我已经设置为混杂模式使用: struct ifreq ifr; strncpy((char*)ifr.ifr_name, interface, IF_NAMESIZE); if(ioctl(sock, SIOCGIFINDEX, &ifr)<0) fail(2); struct packet_mreq mr; memset(&mr, 0, sizeof(mr)); mr.mr_ifindex = ifr.ifr_ifindex; mr.mr_type = PACKET_MR_PROMISC; if(setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) fail(2); 问题是,当我从套接字执行read() ,它只返回来自或到达我的计算机的数据。 我怎样才能读取和处理networking上的所有数据包? Wireshark显示所有的数据包都很好,所以我知道这不是我的电脑或网卡。 ifconfig在运行时报告它是PROMISC 。

如何强制两个进程在同一个CPU上运行?

语境: 我正在编写一个由多个进程组成的软件系统。 它在Linux下用C ++编程。 他们之间使用Linux共享内存进行通信。 通常情况下,在软件开发中,处于性能优化的最后阶段。 在这里,我遇到了一个大问题。 该软件对性能有很高的要求,但在有4个或8个CPU核心的机器上(通常有多个CPU),只能使用3个核心,从而浪费了25%的CPU功率,其次是60%。 经过多次研究,抛弃了互斥和锁争用,我发现时间被shmdt / shmat调用浪费了(分离并附加到共享内存段)。 经过更多的研究,我发现这些通常是AMD Opteron和Intel Xeon的CPU使用了一个名为NUMA的内存系统,这基本上意味着每个处理器都有其快速的“本地内存”,并且从其他CPU访问内存是昂贵。 做了一些testing之后,问题似乎就是这样devise软件,基本上,任何进程都可以将共享内存段传递给任何其他进程,并传递给其中的任何线程。 这似乎杀死了性能,因为进程不断地从其他进程访问内存。 题: 现在的问题是,有没有办法强制在同一个CPU中执行一对进程? 我并不是说要强迫他们总是在同一个处理器上执行,因为我不在乎他们是在哪一个执行的,尽pipe这样做会完成这个任务。 理想情况下,有一种方法可以告诉内核:如果你在一个处理器中调度这个进程,你还必须在同一个处理器中调度这个“兄弟”进程(它是通过共享内存进行通信的进程),这样performance不受惩罚。

如何从可执行文件find源文件名?

IN LINUX:不确定是否有可能。 我有100个源文件和100个相应的可执行文件。 现在,给定可执行文件,是否有可能确定各自的源文件。

Ucontext在Linux中

我读了ucontext是用来保存linux中的多个线程之间的上下文。 由于OS在不同线程之间切换上下文,为什么linux提供这个头文件(ucontext.h)用于上下文切换?