我正在编写一个将共享内存和信号量用于 ipc 的程序。有一个主服务器进程创建共享内存和信号量。任何数量的客户端进程都可以附加到共享内存并在允许时对其进行读写。信号量提供阻塞机制来控制读取和写入。一切正常,除非我尝试终止客户端。访问共享内存的信号量块位于线程中,并且在进程终止时,我无法释放信号量块,因此线程正确退出。我该怎么办?这是针对 Linux 的。
具体来说,有一个 shm 和两个 sem。第一个 sem 阻止写入,第二个阻止读取。当客户端有东西要写时,它会等待 write sem 为 0,然后将其设置为 1,写入,然后将 read sem 设置为 0,这会释放等待的服务器以读取客户端写入的内容。一旦读取,服务器将 write sem 设置回 0,并且下一个客户端开始写入。它挂在读取 sem 为 0 时释放的 semop 调用上。这个 semop 调用在一个线程中,我需要弄清楚如何在让主线程终止之前正确退出该线程。
这是我想做但不起作用的示例(睡眠假装是挂起的 semop 调用):
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void termination_handler (int signum) {
printf( "Got Signal\n" );
}
void *threadfunc( void *parm ) {
struct sigaction action;
action.sa_handler = termination_handler;
sigemptyset( &action.sa_mask );
action.sa_flags = 0;
sigaction( SIGUSR1, &action, NULL );
printf("Thread executing\n");
sleep( 100 ); // pretending to be the semaphore
pthread_exit( NULL );
}
int main() {
int status;
pthread_t threadid;
int thread_stat;
status = pthread_create( &threadid, NULL, threadfunc, NULL );
if ( status < 0) {
perror("pthread_create failed");
exit(1);
}
sleep( 5 );
status = pthread_kill( threadid, SIGUSR1 );
if ( status < 0 )
perror("pthread_kill failed");
status = pthread_join( threadid, (void *)&thread_stat );
if ( status < 0 )
perror("pthread_join failed");
exit( 0 );
}