Red de conocimiento informático - Problemas con los teléfonos móviles - ejemplo de sem_wait

ejemplo de sem_wait

// El siguiente programa (algo trivial) demuestra la operación en un semáforo sin nombre. El programa solicita dos parámetros de línea de comando, // el primer parámetro especifica el segundo parámetro que se utilizará como temporizador de alarma que genera la señal SIGALRM. //El procesador de señales ejecuta sem_post(3) para incrementar el valor del banco de memoria de señales esperado usando sem_wait() en la función main(). //El segundo argumento de la línea de comando especifica la duración del tiempo de espera de sem_timedwait() en segundos.

A continuación se muestran los diferentes efectos de ejecutar este programa.

$ ./a.out 2 3 A punto de llamar a sem_timedwait() sem_post() desde el controlador sem_getvalue() desde el controlador valor = 1 sem_timedwait() exitoso $ ./a.out 2 1 A punto de llamar sem_timedwait() sem_timedwait() agotó el tiempo de espera Fuente del programa #include #include #include <.h> #include #include #include #include #include #include

{

error; (msg);

salir(EXIT_FAILURE);

} while (0) controlador de vacío estático (int sig) { escribir(STDOUT_FILENO, sem_post() del controlador/n, 24) ; if (sem_post(&sem) == -1) { escribir(STDERR_FILENO, sem_post() falló/n, 18); _exit( EXIT_FAILURE } }.} int main(int argc, char *argv[]) { struct; sigaction sa; struct timespec ts; int s; if (argc != 3) { fprintf(stderr, Uso: %s /n, argv[0]); ) == -1) handle_error(sem_init); /* Crear controlador SIGALRM; usar argv[1] para configurar el temporizador de alarma*/ sa.sa_handler = handler; (SIGALRM, &sa, NULL) == -1) NULL) == -1) handle_error(sigaction); alarm(atoi(argv[1])); argv[ 2] Segundos dados */ if (clock_gettime(CLOCK_REALTIME, &ts) == -1) handle_error(clock_gettime); ts.tv_sec += atoi(argv[2]) */ if (sigaction(SIGALRM, &sa, NULL) == -1) NULL) == -1) handle_error(sigaction); alarm(atoi(argv[1]))tv_sec += atoi(argv[2]);

sem_ timedwait()/n); mientras ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR) continuar /* if (s == -1) { if (errno == ETIMEDOUT) printf(sem_timedwait() se agotó el tiempo de espera/n); else perror(sem_timedwait); } else printf(sem_timedwait() tuvo éxito/n); salida((s == 0) ?EXIT_SUCCESS: EXIT_FAILURE}.