基本介紹
- 中文名:sem_trywait
- 功能:鎖定信號
- 頭檔案:#include <semaphore.h>
- 類似函式:int sem_wait(sem_t *sem)
基本信息,內容簡介,功能說明,返回值,實例,參見,
基本信息
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);
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");
#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");