函式名
sem_trywait功能:鎖定信號
類似函式
sem_wait, sem_timedwait內容簡介
頭檔案:#include <semaphore.h>函式原型:int sem_trywait(sem_t *sem);
類似函式:
int sem_wait(sem_t *sem);
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
連結參數: -lrt 或 -pthread
功能說明
1.int sem_wait(sem_t *sem)函式sem_wait()遞減由sem_t類型的指針變數sem指向的信號量。如果信號量(*sem)的值大於0,則將信號量的值減一,然後函式立即返回;如果信號量的當前值為0,則調用sem_wait()函式的執行緒或進程被阻塞,直到信號量的值大於0或者信號處理程式中斷調用。(常用 sigaction(2) SA_RESTART ,即sigaction函式的第二個參數中值為SA_RESTART的標誌)
int sem_trywait(sem_t *sem)
函式 sem_trywait()和sem_wait()有一點不同,即如果信號量的當前值為0,則返回錯誤而不是阻塞調用。錯誤值errno設定為EAGAIN。sem_trywait()其實是sem_wait()的非阻塞版本。返回值
執行成功返回0,執行失敗返回 -1且信號量的值保持不變。errno的值如下:
EINTR:The call was interrupted by a signal handler.(信號處理函式中斷調用)
EINVAL: sem is not a valid semaphore.(信號量sem值無效)
EAGAIN: The operation could not be performed without blocking (i.e., the semaphore currently has the value zero).
實例
#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 <alarm-secs> <wait-secs>\n",argv[0]);
exit(EXIT_FAILURE);
}
if (sem_init(&sem, 0, 0) == -1)
handle_error("sem_init");
/* Establish SIGALRM handler; set alarm timer using argv[1] */
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGALRM, &sa, NULL) == -1)
handle_error("sigaction");
alarm(atoi(argv[1]));
/* Calculate relative interval as current time plus number of seconds given argv[2] */
if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
handle_error("clock_gettime");
ts.tv_sec += atoi(argv[2]);
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);
}