小编cam*_*ccc的帖子

在调用mmap之后我是否需要保持文件打开?

我有一个程序可以映射相当多的(100个)大小的文件,每个文件10-100MB.我需要它们全部同时映射.

目前我打电话open,然后mmap在程序,随后开始munmapclose结尾.

通常我必须ulimit -n在运行程序之前调整打开的文件限制.

问题是我实际上需要保持文件打开,或者我可以在完成后open mmap close进行一些大数据处理munmap.

的手册页mmap似乎并不非常清楚,我在这一个.

c mmap

54
推荐指数
1
解决办法
1万
查看次数

解释valgrind错误无效的写入大小4

我最近试图追踪我正在使用valgrind的程序中的一些错误,我得到的错误之一是:

==6866== Invalid write of size 4
==6866==    at 0x40C9E2: superneuron::read(_IO_FILE*) (superneuron.cc:414)
Run Code Online (Sandbox Code Playgroud)

违规行#414读取

amplitudes__[points_read] = 0x0;
Run Code Online (Sandbox Code Playgroud)

和振幅_早先被定义为

uint32_t * amplitudes__ = (uint32_t* ) amplitudes;
Run Code Online (Sandbox Code Playgroud)

现在显然uint32_t是4个字节长,所以这是写入大小,但有人可以告诉我它为什么无效?

gcc valgrind

10
推荐指数
1
解决办法
2万
查看次数

是否可以列出由于潜在的锯齿违规而导致的负载?

我一直在研究一个相当大的性能关键代码库,用最新版本的gcc进行编译会给出关于类型惩罚的大量警告,这使我可以编译-fno-strict-aliasing.我不相信这里有任何性能损失,无论如何都可以避免.但我确实认为,相同类型的别名指针可能存在更为重要的问题.

有没有办法让gcc或任何其他工具列出代码库中的所有位置,其中由于gcc无法检测到的潜在锯齿违规,指针是否属于同一类型而发生了额外的加载/存储?这样,我可以与代码分析器进行比较,看看是否可以通过使用restrict,局部变量,重构等来改善实际情况的地方.试着通过查看生成的汇编程序来猜测编译器的想法是既费时又容易出错,特别是对此.如果它们不同,我对C和C++的答案感兴趣.

c c++ optimization gcc

8
推荐指数
1
解决办法
158
查看次数

fwrite对于大量小写的效率

我有一个程序可以保存许多大文件> 1GB使用fwrite它工作正常,但不幸的是由于数据的性质每次调用fwrite只写1-4字节.结果是写入可能需要一个多小时,大部分时间似乎是由于系统调用开销(或至少在fwrite的库函数中).我有类似的问题fread.

有没有人知道任何现有/库函数将使用内联函数缓冲这些写入和读取,或者这是另一个自己的卷?

c++ unix fwrite system-calls

7
推荐指数
3
解决办法
1万
查看次数

在多线程环境中捕获信号

我有一个大型程序,需要尽可能具有弹性,并具有大量的线程.我需要捕获所有信号SIGBUS SIGSEGV,并在必要时重新初始化问题线程,或禁用线程继续减少功能.

我的第一个想法是做一个setjump,然后设置信号处理程序,可以记录问题,然后longjump回到线程中的恢复点.有一个问题是信号处理程序需要确定信号来自哪个线程,使用适当的跳转缓冲区作为跳回到错误的线程将是无用的.

有没有人知道如何确定信号处理程序中的违规线程?

c multithreading signals longjmp

6
推荐指数
1
解决办法
626
查看次数

在 python 中初始化 libevdev 以便设备可以有多个工具工作

我一直在研究基于 python 的驱动程序,以在一些旧平板电脑中恢复一些功能。

我初始化如下

dev.enable(libevdev.EV_REL.REL_X )
dev.enable(libevdev.EV_REL.REL_Y )
dev.enable(libevdev.INPUT_PROP_DIRECT)
dev.enable(libevdev.EV_KEY.BTN_TOOL_PEN)
dev.enable(libevdev.EV_KEY.BTN_TOOL_RUBBER)
dev.enable(libevdev.EV_KEY.BTN_TOOL_MOUSE)
dev.enable(libevdev.EV_KEY.BTN_STYLUS)
dev.enable(libevdev.EV_KEY.BTN_STYLUS2)
dev.enable(libevdev.EV_ABS.ABS_X,libevdev.InputAbsInfo(minimum=0, maximum=Xmax*10,resolution=1270))
dev.enable(libevdev.EV_ABS.ABS_Y,libevdev.InputAbsInfo(minimum=0, maximum=Ymax*10,resolution=1270))
dev.enable(libevdev.EV_ABS.ABS_PRESSURE,libevdev.InputAbsInfo(0,254))
dev.enable(libevdev.EV_ABS.ABS_TILT_X,libevdev.InputAbsInfo(minimum=-64, maximum=64))
dev.enable(libevdev.EV_ABS.ABS_TILT_Y,libevdev.InputAbsInfo(minimum=-64, maximum=64))
dev.enable(libevdev.EV_KEY.BTN_LEFT)
dev.enable(libevdev.EV_KEY.BTN_RIGHT)


uinput = dev.create_uinput_device()
Run Code Online (Sandbox Code Playgroud)

然而当

[InputEvent(EV_KEY, BTN_TOOL_MOUSE, 1), InputEvent(EV_SYN, SYN_REPORT, 0)]
Run Code Online (Sandbox Code Playgroud)

发送后,此后在 xinput 中列出了笔而不是鼠标,尽管随后

[InputEvent(EV_KEY, BTN_TOOL_PEN, 1), InputEvent(EV_SYN, SYN_REPORT, 0)]
Run Code Online (Sandbox Code Playgroud)

工作,再次将输入工具设置为鼠标后,发送的位置数据将被忽略。

只有钢笔和橡皮擦工作。我以某种方式初始化这个错误吗?在 Ubuntu 20 和 FreeBSD 12 上测试

python driver evdev

6
推荐指数
0
解决办法
527
查看次数

编译器预处理期间的数学运算

我经常遇到这样的情况:我需要在编译时生成几个常量,以便使用位移和屏蔽操作.

例如

#define blockbits 8
#define blocksize 256   // could be generated from 2^blockbits
#define blocksize 0xFF  // could be generated from blocksize - 1
Run Code Online (Sandbox Code Playgroud)

我想要生成所有这些blockbits,但是没有可以在我知道的预处理器中使用的电源操作.

有没有人知道在编译时生成这种事情的简单方法?

c++ gcc c-preprocessor

5
推荐指数
1
解决办法
1420
查看次数

如何管理大型阵列

我有一个 C++ 程序,它使用几个非常大的双精度数组,我想减少该程序的这个特定部分的内存占用。目前,我分配了 100 个,每个可以是 100 Mb。

现在,我确实有一个优势,即这些数组的某些部分最终会在程序执行的后续部分中变得过时,并且几乎不需要在任何时候将其中任何一个数组的全部内容存储在内存中。

我的问题是这样的:

在我使用 new 或 malloc 创建数组后,有什么方法可以告诉操作系统其中的一部分不再需要了吗?我得出的结论是,实现此目的的唯一方法是声明一个指针数组,每个指针都可能指向所需数组的一个块(例如 1Mb),以便不再需要旧的块可以重新用于数组的新位。在我看来,这就像编写一个自定义内存管理器,这看起来确实有点像大锤,这也会对性能造成一些影响

我无法移动数组中的数据,因为这会导致太多线程争用问题。这些数组可以随时被大量线程中的任何一个访问,尽管只有一个线程写入任何给定的数组。

c++ optimization memory-management

3
推荐指数
1
解决办法
1518
查看次数

隐式声明是否应该返回错误

考虑以下测试程序

#include<stdio.h>
#include<stdlib.h>
#include <math.h>

int main()
{
   double t = nan(NULL);
   printf("%g\n",t);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译

/usr/local/bin/gcc  -lm -o test test.c
Run Code Online (Sandbox Code Playgroud)

输出是预期的NaN.但是,如果我输入错误或犯了错误而遗漏了

#include <math.h>
Run Code Online (Sandbox Code Playgroud)

它编译好,没有错误,没有警告,但输出为0

如果我用-Wall它编译确实给出警告警告:隐式声明函数`nan'虽然这种行为似乎不仅仅是一个警告.是否有任何意义不停止编译?并且有没有人有任何建议如何阻止这导致相当大的文件的主要问题?

c gcc

3
推荐指数
1
解决办法
372
查看次数

如何允许工作线程更新 X11 窗口?

我有一个应用程序,我试图修改它,以便工作线程可以告诉窗口使用新数据更新自身。

变量定义如下:

Display *d;
Window w;
XEvent exppp;
Run Code Online (Sandbox Code Playgroud)

该窗口使用以下代码启动:

XEvent e;

d = XOpenDisplay(NULL);
if (d == NULL) 
  return 0;

s = DefaultScreen(d);
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 200, 800, 1,
                        BlackPixel(d, s), WhitePixel(d, s));
XSelectInput(d, w, ExposureMask | KeyPressMask);
XMapWindow(d, w);

while (1) {
  XNextEvent(d, &e);
  if (e.type == Expose || e.type == KeyPress) {
    // redraw routine goes here
  }
}
Run Code Online (Sandbox Code Playgroud)

我试图用来让窗口重绘的是一个可以被另一个线程调用的函数:

void graphical_out::redraw()
{
  exppp.type = Expose;
  XSendEvent(d, w, false, Expose, &exppp);
}
Run Code Online (Sandbox Code Playgroud)

并且窗口仅在重新调整大小或接收按键时更新自身。这似乎有点像一个新手问题,但谷歌在这个问题上让我失望。对我做错了什么有什么建议吗?

c++ x11

2
推荐指数
1
解决办法
4651
查看次数

在sparc solaris上使用gcc为long long整数赋值

我遇到了一些我觉得很奇怪的东西.测试程序

int main(int argc, char* argv[])
{
    cout<<"hello"<<endl;
    long unsigned l = 0x12345678;
    long long unsigned ll =  0x12345678;
    cout<<sizeof(l)<<endl;
    cout<<sizeof(ll)<<endl;
};
Run Code Online (Sandbox Code Playgroud)

输出是:

hello    
4    
8
Run Code Online (Sandbox Code Playgroud)

没有惊喜.的long int的大小为4个字节和long long的大小为8个字节.但是,当我更改它以便分配长long时

long long unsigned ll =  0x123456789;
Run Code Online (Sandbox Code Playgroud)

在编译时我得到

error: integer constant is too large for "long" type
Run Code Online (Sandbox Code Playgroud)

现在,这个相同的测试编译,如果我使用选项强制的64位版本-m64.我做错了什么或者这是GCC中的错误?

c++ gcc solaris sparc long-long

1
推荐指数
1
解决办法
1269
查看次数