Articles of 信号量

RedHat Enterprise Linux 5.3以上不支持sem_timedwait?

我们在RedHat Enterprise Linux系统上看到了使用pthreads sem_timedwait的奇怪行为。 只有版本5.3以上才会出现。 当我们用sem_init在后台线程上创build信号量时,不会返回任何错误。 当我们执行sem_timedwait时,我们立即返回errno = 38(ENOSYS),表示不支持。 如果我们在主线程上做同样的事情,它会按预期工作,并且sem_timedwait没有错误。 我们在RHEL 5.2或之前没有看到它。 我们试着用gcc 3.2.3和4.1.2编译我们的代码,并得到相同的结果,所以它似乎是一个运行时问题。 所以,我的问题(最后;) 1)有没有人看过这个? 2)是RHEL 5.3以上的已知问题吗? 3)我们正在使用sem_timedwait睡一个单一的线程。 在Linux上有什么替代方法可以做同样的事情? 如果这是另一个问题的重复,请告诉我。 我看了,但找不到一个相同的问题,只是类似的OSX,这不是我们正在使用的。 谢谢,pxb 更新:刚刚做了更多的testing,结果如下: 如果我在RHEL5.4盒子(使用-L / usr / lib64和-lstdc ++ -lrt)上使用gcc 4.1.2进行64位构build,并在64位安装的RHEL5上运行, 如果我在RHEL5.1盒子(使用-L / usr / lib和-lstdc ++ -lrt)上使用gcc 4.1.2来构build32位版本,并在一个完全相同的64位RHEL5盒子上运行它,我们得到ENOSYS错误sem_timedwait 所以,看起来RHEL5.4(和看似RHEL5.3)上的64位和32位运行库是有区别的。 唯一的区别是32位和64位构build分别完成了RHEL5.1和RHEL5.4盒。

我怎样才能获得多个调用sem_open在C中工作?

在C语言的基础上,我正在经历很多困难。 我的申请过程是这样的: 申请开始 申请分入儿童/家长 每个进程使用具有通用名称的sem_open来打开信号量。 如果我在分叉之前创build信号量,它工作正常。 但是,要求阻止我这样做。 当我第二次尝试调用sem_open时,出现“Permission Denied”错误(通过errno )。 有没有可能以任何方式做到这一点? 还是有什么办法在一个进程中打开信号量,并使用共享内存机制与subprocess共享?

Linux进程间可重入信号量

我正在将一个Windows应用程序移植到Linux,我有一个同步问题。 在Windows中,我使用一个名为互斥体的系统级来同步对共享内存块的访问。 我如何在Linux中模拟? 我已经使用semget创build了一个SystemV信号量。 问题是,它不是可重入的,如果我已经拥有它将阻止,不像在Windows上。 我可以添加一个引用计数,但是然后我需要同步访问,这意味着另一个(这次只针对当前进程)互斥体。 是否有一个类提供了一个可重入的进程间锁(也许在升压)? 顺便说一下,使用文件locking是不可接受的,因为它可能会太慢(我需要两个进程之间的超低延迟通信)。

当两个进程尝试访问信号量为0的关键部分时会发生什么?

在我的代码中,我做了以下初始化: struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , .semaphoreFlag = FALSE }; int initPipe() { if (!myPipe.init) { myPipe.mutex = mmap (NULL, sizeof *myPipe.mutex, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, […]

什么时候调用sem_unlink()?

我有点困惑的Linux API sem_unlink(),主要是什么时候或为什么要调用它。 我已经在Windows中使用了信号量多年。 在Windows中,一旦closures了命名信号量的最后一个句柄,系统就会删除底层的内核对象。 但是在Linux中,开发人员需要通过调用sem_unlink()来移除内核对象。 如果内核对象没有保存在/ dev / shm文件夹中。 我遇到的问题是,如果进程A调用sem_unlink()而进程Blocking了信号量,则立即破坏信号量,而当进程C出现时,进程B不再受信号量的“保护”。 更重要的是,这个手册页最令人困惑的是: “信号量名称立即被删除,一旦信号量打开的其他进程closures,信号量就会被破坏。 如果需要等待其他进程closures信号量,它如何立即销毁对象? 显然我不明白在Linux上正确使用信号量对象。 谢谢你的帮助。 下面是我用来testing这个的一些示例代码。 int main(void) { sem_t *pSemaphore = sem_open("/MyName", O_CREAT, S_IRUSR | S_IWUSR, 1); if(pSemaphore != SEM_FAILED) { if(sem_wait(pSemaphore) == 0) { // Perform "protected" operations here sem_post(pSemaphore); } sem_close(pSemaphore); sem_unlink("/MyName"); } return 0; }

ubuntu:sem_timedwait不醒(C)

我有3个进程需要同步。 进程之一做一些事情然后唤醒进程二,然后进入hibernate状态,然后执行一些事情,然后唤醒进程三,然后进入hibernate状态。 整个循环定时运行25hz(由于在我的“真实”应用程序中触发了两个进程之前,由外部同步进入到进程1)。 我使用sem_post触发(唤醒)每个进程,sem_timedwait()等待触发器。 这一切都成功地运行了几个小时。 然而,在一些随机的时间(通常在两到四个小时之后),其中一个进程在sem_timedwait()中开始超时,尽pipe我确信信号量是由sem_post()触发的。 为了certificate这一点,我甚至在超时之后立即使用sem_getvalue(),值为1,所以timedwait应该已经被触发了。 请看下面的代码: #include <stdio.h> #include <time.h> #include <string.h> #include <errno.h> #include <semaphore.h> sem_t trigger_sem1, trigger_sem2, trigger_sem3; // The main thread process. Called three times with a different num arg – 1, 2 or 3. void *thread(void *arg) { int num = (int) arg; sem_t *wait, *trigger; int val, retval; […]

删除Linux上的所有共享内存和信号量

如何在Ubuntu中使用单个命令删除所有未使用的信号量和共享内存?

进程间信号量有时不像预期的那样工作

我有以下C代码,其中以sm为前缀的variables由两个进程proc1和proc2共享。 因此信号量也是共享的。 这个代码被重复调用。 所以如果我说以前的价值,这意味着以前的迭代的价值。 我注意到在我的程序中, proc1有时会传递sem_wait(sem_f2l)而没有proc2执行sem_post(sem_f2l) 。 这我注意到,因为sm_value_proc1和sm_value_proc2应该在我的程序中具有相同的值,这也是由printfs用>>>确认的。 但是,使用<<<的printf有时会显示不同的值。 不同之处在于proc1打印了以前的sm_value_proc2值,因为proc1神秘地不会等待proc2发布sm_f2l 。 任何想法这里怎么了? // semaphores are initialized like this -> sem_init( sm_l2f, 1, 0 ); // Note that sm_l2f and sm_f2l are pointers to sem_t // sm_condition is assigned here by proc1 if ( is_proc1 ) { sem_post( sm_l2f ); // proc2_value should be updated by […]

sem_open()错误:“未定义的引用到sem_open()”在Linux上(Ubuntu 10.10)

所以我得到的错误:“未定义的引用sem_open()”即使我已经包括semaphore.h头。 所有我的pthread函数调用(互斥体,pthread_create等)都发生了同样的事情。 有什么想法吗? 我正在使用下面的命令来编译: g ++'/home/robin/Desktop/main.cpp'-o'/home/robin/Desktop/main.out' #include <iostream> using namespace std; #include <pthread.h> #include <semaphore.h> #include <fcntl.h> const char *serverControl = "/serverControl"; sem_t* semID; int main ( int argc, char *argv[] ) { //create semaphore used to control servers semID = sem_open(serverControl,O_CREAT,O_RDWR,0); return 0; }

将POSIX信号量的值增加1以上

我有这个要求,我必须增加一个POSIX信号量的值超过1。 显然,在POSIX规范中没有办法做到这一点。 没有类似于sem_getvalue()的sem_setvalue()。 我不想因为这个限制而回到System V信号量。 有没有其他办法可以做到这一点? 或者我将不得不去System V的方式? 我在GNU / Linux的C编程。 非常感谢提前。