草庐IT

mmap_sem

全部标签

ios - 为什么 mmap() 使用 MAP_FAILED 而不是 NULL?

有人知道为什么mmap()返回MAP_FAILED而不是NULL吗?在大多数系统上,MAP_FAILED似乎是(void*)-1。为什么mmap()不直接使用NULL呢?我知道地址0x0在技术上是一个有效的内存页面,而(void*)-1永远不会是一个有效的页面。然而我的猜测是mmap()实际上永远不会返回页面0x0。例如,在Windows上,VirtualAlloc()在出错时返回NULL。假设mmap()永远不会返回0x0是否安全?据推测,对mmap()的成功调用应该将可用内存返回给调用者。地址0x0永远不可用,因此它永远不会在成功时返回。在这种情况下,使用0x0作为失败标记似乎是明

ios - 为什么 mmap() 使用 MAP_FAILED 而不是 NULL?

有人知道为什么mmap()返回MAP_FAILED而不是NULL吗?在大多数系统上,MAP_FAILED似乎是(void*)-1。为什么mmap()不直接使用NULL呢?我知道地址0x0在技术上是一个有效的内存页面,而(void*)-1永远不会是一个有效的页面。然而我的猜测是mmap()实际上永远不会返回页面0x0。例如,在Windows上,VirtualAlloc()在出错时返回NULL。假设mmap()永远不会返回0x0是否安全?据推测,对mmap()的成功调用应该将可用内存返回给调用者。地址0x0永远不可用,因此它永远不会在成功时返回。在这种情况下,使用0x0作为失败标记似乎是明

linux - 什么时候调用 sem_unlink()?

我对LinuxAPIsem_unlink()有点困惑,主要是何时或为何调用它。我在Windows中使用信号量已经很多年了。在Windows中,一旦关闭命名信号量的最后一个句柄,系统就会删除底层内核对象。但它出现在Linux中,开发人员需要通过调用sem_unlink()来删除内核对象。如果不这样做,内核对象将保留在/dev/shm文件夹中。我遇到的问题是,如果进程A调用sem_unlink()而进程B已锁定信号量,它会立即销毁信号量,现在当/如果进程C到来时,进程B不再受信号量“保护”沿着。更重要的是,手册页充其量是令人困惑的:“信号量名称立即被删除。一旦打开信号量的所有其他进程关闭它

linux - 什么时候调用 sem_unlink()?

我对LinuxAPIsem_unlink()有点困惑,主要是何时或为何调用它。我在Windows中使用信号量已经很多年了。在Windows中,一旦关闭命名信号量的最后一个句柄,系统就会删除底层内核对象。但它出现在Linux中,开发人员需要通过调用sem_unlink()来删除内核对象。如果不这样做,内核对象将保留在/dev/shm文件夹中。我遇到的问题是,如果进程A调用sem_unlink()而进程B已锁定信号量,它会立即销毁信号量,现在当/如果进程C到来时,进程B不再受信号量“保护”沿着。更重要的是,手册页充其量是令人困惑的:“信号量名称立即被删除。一旦打开信号量的所有其他进程关闭它

c - 当长度大于 4GB 时 mmap 失败

(正确的代码在“更新5”中)在此示例C代码中,我尝试映射从0x100000000到0x200000000的内存范围:#include#include#include#includeintmain(void){uint64_t*rr_addr=0;uint64_ti=17179869184;printf("\nsizeof(size_t):%llu\n",sizeof(size_t));printf("(uint64_t)0x100000000:%llx\n",(uint64_t)0x100000000);printf("1L在不同的系统(Linux、gcc)上,我得到不同的结果:结果1

c - 当长度大于 4GB 时 mmap 失败

(正确的代码在“更新5”中)在此示例C代码中,我尝试映射从0x100000000到0x200000000的内存范围:#include#include#include#includeintmain(void){uint64_t*rr_addr=0;uint64_ti=17179869184;printf("\nsizeof(size_t):%llu\n",sizeof(size_t));printf("(uint64_t)0x100000000:%llx\n",(uint64_t)0x100000000);printf("1L在不同的系统(Linux、gcc)上,我得到不同的结果:结果1

c - mmap函数中的MAP_SHARED和MAP_PRIVATE有什么区别?

为了好玩而使用mmap,我有以下代码:(..snip..)fd=open("/home/me/straight_a.txt",O_RDONLY);if(fd==-1){perror("open");exit(1);}m=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_FILE|MAP_PRIVATE,fd,0);if(m==MAP_FAILED){perror("mmap");exit(1);}printf("mis%p\n",m);printf("*m=%c\n",*m);printf("*(m+1)=%c\n",*(m+1));(..snip..)这

c - mmap函数中的MAP_SHARED和MAP_PRIVATE有什么区别?

为了好玩而使用mmap,我有以下代码:(..snip..)fd=open("/home/me/straight_a.txt",O_RDONLY);if(fd==-1){perror("open");exit(1);}m=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_FILE|MAP_PRIVATE,fd,0);if(m==MAP_FAILED){perror("mmap");exit(1);}printf("mis%p\n",m);printf("*m=%c\n",*m);printf("*(m+1)=%c\n",*(m+1));(..snip..)这

c - mmap 与/开发/零

假设我使用/dev/zero为mmap分配了一个大内存(40MB),如下所示。fd=open("/dev/zero",O_RDWR);a=mmap(0,4096e4,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FILE,fd,0);我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我想现代Linux内核使用Demandpaging)。因此,例如,当第一页被触及并因此被带入物理内存时,内核会将其所有4096字节初始化为零,然后当第二页被触及时,它会执行相同的操作,依此类推。我的理解正确吗? 最佳答案

c - mmap 与/开发/零

假设我使用/dev/zero为mmap分配了一个大内存(40MB),如下所示。fd=open("/dev/zero",O_RDWR);a=mmap(0,4096e4,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FILE,fd,0);我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我想现代Linux内核使用Demandpaging)。因此,例如,当第一页被触及并因此被带入物理内存时,内核会将其所有4096字节初始化为零,然后当第二页被触及时,它会执行相同的操作,依此类推。我的理解正确吗? 最佳答案