Tag: posix

mmap:强制执行64K对齐

我正在将一个由Windows编写的项目移植到移动平台上。 我需要一个等效的VirtualAlloc (+朋友),自然的是mmap 。 但是有两个显着的差异。 VirtualAlloc返回的地址保证是所谓的分配粒度 ( dwAllocationGranularity )的dwAllocationGranularity 。 不要与页面大小混淆,这个数字是任意的,并且在大多数Windows系统上是64K。 相比之下, mmap返回的地址只能保证页面对齐。 可以通过调用VirtualFree立即释放保留/分配的区域,并且不需要传递分配大小(即VirtualAlloc使用的大小)。 相比之下, munmap应该被赋予要取消映射的确切区域大小,即它释放给定数量的内存页面,而没有关于它们如何分配的任何关系。 这给我带来了麻烦。 虽然我可以忍受(2),但(1)是一个真正的问题。 我不想深入了解细节,但假设分配粒度小得多,例如4K,将导致严重的效率降低。 这与我的代码需要在分配的区域内的每个粒度边界处放置一些信息这一事实有关,这会在连续的存储区域内产生“间隙”。 我需要解决这个问题。 我可以考虑分配增加区域的非常天真的方法,这样它们可以是64K对齐的并且仍然具有足够的大小。 或者可选择保留虚拟地址空间的大区域,然后分配正确对齐的内存区域(即实现一种对齐的堆)。 但我想知道是否有其他选择。 比如特殊的API,可能是一些标志,秘密系统调用或其他什么。

当前的C11实施状态()?

我很好奇C11实现的状态是什么,特别是关于可选的 。 目前是否有任何平台支持这些接口? 如果没有,是否有任何计划在POSIX和/或WinAPI方面实现接口? 是否有其他人计划使用C11中描述的接口( thrd_t , mtx_t , cond_t等等)?

getnameinfo指定socklen_t

getnameinfo原型的第二个arg要求socklen_t类型,但sizeof使用size_t。 那我怎么能得到socklen_t? 原型: int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen, int flags); 例: struct sockaddr_in SIN; memset(&SIN, 0, sizeof(SIN)); // This should also be socklen_t ? SIN.sin_family = AF_INET; SIN.sin_addr.s_addr = inet_addr(IP); SIN.sin_port = 0; getnameinfo((struct sockaddr *)&SIN, sizeof(SIN) /* socklen_t */, BUFFER, NI_MAXHOST, […]

每个进程的最大线程数 – sysconf(_SC_THREAD_THREADS_MAX)失败

我试图在UNIX机器上找到每个进程的最大线程数,并编写下面的代码以使用sysconf: #include #include #include #include #include int main() { errno = 0; long maxThreads = sysconf(_SC_THREAD_THREADS_MAX); if (maxThreads == -1 && errno == 0) { printf(“the variable corresponding to _SC_THREAD_THREADS_MAX ” “is associated with functionality that is not ” “supported by the system\n”); exit(1); } if (maxThreads == -1) { printf(“errno: %d\n”, errno); exit(1); } […]

C hsearch发现之前未输入的值

这是这个问题的后续问题 。 由于我解决了部分内容并且我觉得剩下的问题与第一个问题无关,所以我决定将这两部分分成两个问题。 我已经使用POSIX hcreate / hsearch实现了一个关联数组, hcreate hsearch 。 为了完整起见,以下是除上一个问题的main()函数之外的所有代码: #include /* intptr_t */ #include /* hcreate(), hsearch() */ #include /* perror() */ #include /* exit() */ #include /* strcpy() */ void exit_with_error(const char* error_message){ perror(error_message); exit(EXIT_FAILURE); } int fetch(const char* key, intptr_t* value){ ENTRY e,*p; e.key=(char*)key; p=hsearch(e, FIND); if(!p) return 0; *value=(intptr_t)p->data; return […]

在Posix中,如何使用类型dev_t?

我所追求的是这种类型的含义以及可以使用它的界面。 在Posix规范中解释了dev_t用于设备ID。 但是,对于路径描述的任何对象,设备ID是什么意思,可以是文件,直接,fifo或物理设备? 例如,调用stat()会给你一个包含这种类型成员的结构; 并且您可以在文件系统中统计任何类型的对象。 对于不同的文件类型,设备ID应具有不同的含义。

即使使用SA_RESTART,哪些function也会被信号中断?

当接收或处理信号时,是否有任何合理完整的POSIX中哪些函数被EINTR中断的列表,即使没有信号处理程序或者处理程序是否安装了SA_RESTART ? 一些例子: select nanosleep 等等

我可以将const char *数组传递给execv吗?

这是execv的原型: int execv(const char *path, char *const argv[]); 我可以传递一个const char指针数组作为第二个参数吗? 此示例程序在未设置USE_CAST时发出警告: #include int main(int argc, char *argv[]) { if (argc > 0) { const char *exe_name = “/bin/echo”, *message = “You ran”; const char *exe_args[] = { exe_name, message, argv[0], NULL }; #ifdef USE_CAST execv(“/bin/echo”, (char **) exe_args); #else execv(“/bin/echo”, exe_args); #endif } return 0; […]

确定函数是否是异步信号安全的(可以在信号处理程序中调用)

我的问题是: 如果您无法访问其实现,是否有办法确定函数是否是异步信号安全的? 如果没有,有没有办法测试函数是否异步信号安全足以从信号处理程序调用? 如果您读取signal()或sigaction()的手册页,您将获得一个async-signal-safe函数列表(可以在信号处理程序中安全地调用的函数)。 但是,我认为这份清单并非详尽无遗。 例如, Async-signal-safe函数头下的以下页面http://linux.die.net/man/7/signal读取: POSIX.1-2004(也称为POSIX.1-2001技术勘误2)要求实现以保证在信号处理程序内可以安全地调用以下函数: 然后它继续列出上面手册页中列出的正常异步信号安全function。 当我读它时,它说“它需要”,而不是“这些是唯一的”。 例如, 该站点说back_trace_symbols_fd()是异步信号安全的。 该函数获取的是来自dladdr()的数据,并且它不像back_trace_symbols()那样使用malloc(),所以看起来它可能是安全的。 此外,我做了一些测试,并且dladdr()的输出结构包含char *变量,但这些变量在运行时不是malloc。 他们指向的char字符串甚至在调用dladdr()之前就存在于运行时。 任何可以指向正确方向的想法或想法都会受到赞赏。

如何从信号编号中获取人类可读的描述?

POSIX标准或其他C标准是否提供了一种从信号编号中恢复有意义消息的方法,就像strerror()可以从errno恢复消息一样? Gnu C库有strsignal() ,但是如果可能的话,我想要一些可移植到BSD和其他Unix变种的东西。