Articles of c + +

堆alignment的记忆保护神秘地工作

所以我试图检查,如果我可以正确地使用mprotect更改mmapped分配内存的访问权限,这就是我写的: #include <stdio.h> #include <sys/mman.h> #include <malloc.h> #include <unistd.h> void main() { int pagesize; pagesize = getpagesize(); void *p; p = malloc(pagesize); getchar(); int q = posix_memalign(&p, pagesize, pagesize); getchar(); int a = mprotect(p, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC); getchar(); free(p); } 现在每个函数后,我使用getchar来分析我的内存段使用cat /proc/<pid>/maps文件,这就是我得到:(只显示关于堆的信息,因为这是我唯一担心的) posix_memalign : 01776000-01798000 rw-p 00000000 00:00 0 [heap] mprotectfunction之后: 01776000-01778000 […]

debuggingpostgresql的'A'<'a'

在一个简单的比较testing中,在postgres 9.1和8.4中得到以下奇怪的结果。 postgres=# select 1 one where 'A' < 'a'; one —– (0 rows) // ….. I would have expected 1 row postgres=# select 1 one where 'A' < 'b'; one —– 1 (1 row) // …… this looks OK postgres=# select 1 one where 'A' = 'a'; one —– (0 rows) // …… This […]

Libev – I / Ocallback

我有一个使用TCP套接字的C / Linux聊天服务器。 当使用libev时,我可以为套接字创build一个ev_io监视器来读取一次事件。 就像是: ev_io* new_watcher = (ev_io*)malloc(sizeof(ev_io)); //initialize the watcher ev_init(new_watcher, read_cb); //set the fd and event to fire on write ev_io_set(new_watcher, watcher->fd, EV_READ); //start watching ev_io_start(loop, new_watcher); 这工作正常,因为读取事件只会触发有数据要读取。 但是,我不得不以不同的方式来处理写入事件,因为即使没有数据写入,它们也会不断地被触发。 为了解决这个问题,我有我的read_callback只有当有数据准备写入时才为写入数据创build一个ev_io监视器,然后write_callback在它发送消息后将删除监视器。 这意味着我每次需要处理消息时都要分配,初始化,设置,监视,取消和取消分配写入观察器。 我担心我可能会错误地,低效地处理这个问题。 在libev中处理write_callback事件的最佳方法是什么? 提前致谢。

未findglXCreateContextAttribsARB(在OpenGL 4.2驱动程序,GLX 1.4上)

奇怪的是,尽pipe我有GLX 1.4,但是在我的回购中没有glXCreateContextAttribsARB 。 我想知道这是否有合理的解释? 这不是一个普遍的问题。 glxinfo name of display: :0 display: :0 screen: 0 direct rendering: Yes server glx vendor string: NVIDIA Corporation server glx version string: 1.4 server glx extensions: GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGI_video_sync, GLX_SGI_swap_control, GLX_EXT_swap_control, GLX_EXT_texture_from_pixmap, GLX_ARB_create_context, GLX_ARB_create_context_profile, GLX_EXT_create_context_es2_profile, GLX_ARB_create_context_robustness, GLX_ARB_multisample, GLX_NV_float_buffer, GLX_ARB_fbconfig_float, GLX_EXT_framebuffer_sRGB client glx vendor string: NVIDIA Corporation client glx […]

编译问题在linux上

所以我在linux(Ubuntu)中使用emacs文本编辑器编写了下面的代码,它基本上应该将传入的分隔符中的string分开。 当我运行它segfaulted我运行它通过GDB,它给了我一个错误在strcpy(我没有调用),但可能在sprintf隐式完成。 我没有想到我做了什么错误,所以我启动到Windows,并通过Visual Studio运行它,它工作正常,我是新的Linux编写C,并知道问题是在While循环,我打电话sprintf()(哪是奇怪的,因为在循环之外的调用写入而不会导致错误)将令牌写入数组。 如果有人能告诉我哪里出错,我将不胜感激。 这是代码 /* split() Description: – takes a string and splits it into substrings "on" the <delimeter>*/ void split(char *string, char *delimiter) { int i; int count = 0; char *token; //large temporary buffer to over compensate for the fact that we have //no idea how many arguments will be passed […]

信号/暂停死锁

我很难通过信号和共享内存来pipe理subprocess(我知道pipe道可能会更好)。 我有以下循环: * parent processing something, then signaling the children and going into pause, * children processing something, then signaling the parent and going into pause, * etc. etc. 问题是,在发信号通过父(通过kill)之后的某个时候,操作系统切换到父母而不让孩子暂停()。 当它恢复孩子(在家长调用暂停后)孩子然后暂停,我有一个死锁:(。 有什么build议么?

在LINUX C / C ++中,哪些系统调用是可中断的(即errno == EINTR)?

有谁知道一个很好的参考,列出哪些电话是可中断的? 我假设几乎所有的系统调用是以前,但看文件系统调用的手册页打开或重命名 ,错误列表不包括EINTR 。

程序文件句柄

我有一个程序,将文件句柄的数量设置为在程序的入口处无限制。 当程序在根目录下运行时,我对文件句柄没有任何问题。 它可以比初始限制1024开放很多,但非root用户它不超过1024.我看到的最大文件句柄是1007。 用户位于sudoer列表中,并且在/etc/security/limit.conf中没有用户input。 我看到这两个根和非root用户不具有limit.conf文件中的条目。 有没有其他configuration我错过了? 根和非root用户打开的文件句柄的数量的硬限制是多less?

我如何检测USB插入或不是在C中的Linux

我在C编程新手这里我想检测USB插入或不在Linux我想在我的embedded式Linux设备上检测到这个东西。 其中有定制的Linux。 所以我想检测的USB块,我必须安装此块。 像sda,sdb or sdc 。 我想在C编程的这个东西的Linux。 这里我有usb设备的path/sys/bus/usb/devices我可以看到USB信息可用在这里/sys/bus/usb/devices/1-x所以我想获取块的地址插入这个USB像sda,sdb or sdc 。 所以现在取得这个地址名称后,我必须安装USB特定的path。 所以任何人都可以请build议我如何检测USB插入或不插入比我怎么知道这个地址

Linux缓冲区溢出环境variables

我一直在审查不同风格的缓冲区溢出,遇到了一个问题,我不记得它为什么会发生。 下面的代码是我试图执行缓冲区溢出的程序: #include <stdio.h> void func(char *buff){ char buffer[5]; strcpy(buffer, buff); printf("%s\n", buffer); } int main(int argc, char *argv[]){ func(argv[1]); printf("I'm done!\n"); return 0; } 程序的核心概念很简单,我只是溢出缓冲区来覆盖func()的返回地址。 这一切都很好,当我给它一个地址,如0x0804850c正好是程序的<_fini> 。 当我用这个地址实现溢出的最终结果是程序退出“优雅”没有打印I'm done! 。 我现在遇到的问题是,当我试图redirect返回地址的东西说一个环境variables位于0xbfffd89 。 位于特定环境variables中的shell代码应该在发出hello之后退出程序。 然而,这并没有发生,程序简单地分段故障,就是这样。 shell代码已经被证实可以在我写的testingshell代码的前一个程序中使用。 任何人有任何想法,为什么这是行不通的。 谢谢