#include <iostream> #include <cerrno> #include <cstring> #include <pthread.h> #include <semaphore.h> struct FailedOn { FailedOn(const char *f, int e) : func(f), eno(e) {} std::string func; int eno; }; int main(void) { try { sem_t mySemaphore; if (sem_init(&mySemaphore, 0, 0) != 0) throw FailedOn("sem_init", errno); std::cerr << "Calling sem_trywait\n"; if (sem_trywait(&mySemaphore) != 0) { if (errno != EAGAIN) throw FailedOn("sem_trywait", errno); std::cerr << "Wait would have blocked" << std::endl; } else { std::cerr << "Wait succeeded" << std::endl; } if (sem_destroy(&mySemaphore) != 0) throw FailedOn("sem_destroy", errno); return 0; } catch (FailedOn &e) { std::cerr << e.func << " failed: " << strerror(e.eno) << std::endl; } catch (...) { std::cerr << "Unknown exception" << std::endl; } return -1; }