semwait和semsignal(sem_wait的范例)

本文目录
sem_wait的范例
//(有些琐碎的)程序以下展示了在一个未命名的信号量上的操作.程序请求2个命令行参数, //第一个参数指定一个秒的参数来作为报警的定时器来产生SIGALRM信号. //信号处理程序执行sem_post(3)来增加在main()函数中使用sem_wait()等待的信号量的值. //第二个命令行参数指定超时的长度,为sem_timedwait()使用秒为单位. //以下展示了程序的执行的不同效果.
$ ./a.out 2 3 About to call sem_timedwait() sem_post() from handler sem_getvalue() from handler; value = 1 sem_timedwait() succeeded $ ./a.out 2 1 About to call sem_timedwait() sem_timedwait() timed out Program source #include 《unistd.h》 #include 《stdio.h》 #include 《stdlib.h》 #include 《semaphore.h》 #include 《time.h》 #include 《assert.h》 #include 《errno.h》 #include 《signal.h》 sem_t sem; #define handle_error(msg) / do
{
perror(msg);
exit(EXIT_FAILURE);
} while (0) static void handler(int sig) { write(STDOUT_FILENO, sem_post() from handler/n, 24); if (sem_post(&sem) == -1) { write(STDERR_FILENO, sem_post() failed/n, 18); _exit(EXIT_FAILURE); } } int main(int argc, char *argv) { struct sigaction sa; struct timespec ts; int s; if (argc != 3) { fprintf(stderr, Usage: %s /n, argv); exit(EXIT_FAILURE); } if (sem_init(&sem, 0, 0) == -1) handle_error(sem_init); /* Establish SIGALRM handler; set alarm timer using argv */ sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGALRM, &sa, NULL) == -1) handle_error(sigaction); alarm(atoi(argv)); /* Calculate relative interval as current time plus number of seconds given argv */ if (clock_gettime(CLOCK_REALTIME, &ts) == -1) handle_error(clock_gettime); ts.tv_sec += atoi(argv); printf(main() about to call sem_timedwait()/n); while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR) continue; /* Restart if interrupted by handler */ /* Check what happened */ if (s == -1) { if (errno == ETIMEDOUT) printf(sem_timedwait() timed out/n); else perror(sem_timedwait); } else printf(sem_timedwait() succeeded/n); exit((s == 0) ? EXIT_SUCCESS : EXIT_FAILURE); }
sem_wait的函数说明
sem_wait函数也是一个原子操作,它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。也就是说,如果你对一个值为2的信号量调用sem_wait(),线程将会继续执行,将信号量的值将减到1。如果对一个值为0的信号量调用sem_wait(),这个函数就会原地等待直到有其它线程增加了这个值使它不再是0为止。如果有两个线程都在sem_wait()中等待同一个信号量变成非零值,那么当它被第三个线程增加 一个“1”时,等待线程中只有一个能够对信号量做减法并继续执行,另一个还将处于等待状态。sem_trywait(sem_t *sem)是函数sem_wait的非阻塞版,它直接将信号量sem减1,同时返回错误代码。

更多文章:
androidapp源码免费下载(如何实现APK的反编译得到APK的源码)
2026年9月22日 18:00
service pack 3(操作系统版本升级(SP) Service Pack 3当中的“Service Pack 3”是什么意思)
2026年9月22日 10:20
html代码怎么写大佬教程(html网页的题来个大佬,写代码,题目在图上)
2026年9月22日 10:10
结构体内又一个struct(c++ 在结构体中再嵌入一个结构体如何调用)
2026年9月22日 09:40
cocos creator中文(cocoscreator和cocoscreator3d的区别)
2026年9月22日 02:30





