sem_wait的描述
的有关信息介绍如下:sem_wait() 减小(锁定)由sem指定的信号量的值.如果信号量的值比0大, 那么进行减一的操作,函数立即返回. 如果信号量当前为0值,那么调用就会一直阻塞直到或者是信号量变得可以进行减一的操作 (例如,信号量的值比0大),或者是信号处理程序中断调用
sem_trywait() 和 sem_wait()是一样的,除了如果不能够对信号量立即进行减一, 那么sem_trywait()就会返回一个错误(错误号是AGAIN)而不是锁定. sem_timedwait() 和 sem_wait()是一样的,除了如果减一操作不能立即执行的话, abs_timeout 指定了调用应该被阻塞的时间限制. abs_timeout 参数指向了一个结构体指定了由秒和纳秒组成的绝对的超时值: 从1970-01-01 00:00:00 +0000纪元开始的UTC,结构体的定义如下: struct timespec { time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds [0 .. 999999999] */ }; 如果超时值已经超过了调用规定的值,那么信号量不能被立即锁定, 之后sem_timedwait() 为超时失败(error设置为ETIMEDOUT).
如果操作立即生效,那么sem_timedwait() 永远不会返回超时的错误,不管abs_timeout的值. 更进一步的是,在这种情况下abs_timeout值的有效性都不会检查. EINTR The call was interrupted by a signal handler; see signal(7). //调用被信号处理中断
EINVAL sem is not a valid semaphore. //sem不是有效的信号量
The following additional error can occur for sem_trywait(): //下面的错误是sem_trywait()可能发生的:
EAGAIN The operation could not be performed without blocking (i.e., the semaphore currently has the value zero). //除了锁定无法进行别的操作(如信号量当前是0值).
The following additional errors can occur for sem_timedwait(): //下面的错误是sem_timedwait()可能发生的:
EINVAL The value of abs_timeout.tv_nsecs is less than 0, or greater than or equal to 1000 million. //abs_timeout.tv_nsecs 的值比0小或者大于等于1000毫秒(译者注:纳秒的值不能比0小,不能比1秒大)
ETIMEDOUT The call timed out before the semaphore could be locked. //在信号量锁定之前就超时了 对这些函数,信号处理程序总是会中断阻塞,不管是否使用了sigaction(2)的SA_RESTART标志位.