Programa en Lenguaje C que manipula dos Semáforos. En breve lo comentare.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define SEM_HIJO 0
#define SEM_PADRE 1
main (int argc, int *argv[]) {
int i = 10, semid, pid;
struct sembuf opera;
key_t llave;
llave = ftok ( argv[0], ‘K’ );
if ( ( semid = semget ( llave, 2, IPC_CREAT | 0666 ) ) == -1 ) {
perror ( “semget” );
exit ( -1 );
}
// Cerrar el Semaforo del Hijo
semctl ( semid, SEM_PADRE, SETVAL, 0 );
// Abrir el Semaforo del Padre
semctl ( semid, SEM_PADRE, SETVAL, 1 );
if ( ( pid = fork () ) == -1 ) {
perror ( “fork “);
exit ( -1 );
}
else if ( pid == 0 ) {
while ( i ) {
opera.sem_num = SEM_HIJO;
opera.sem_op = -1;
opera.sem_flg = 0;
semop (semid, &opera, 1);
printf ( “Proceso Hijo: %d\n “, i– );
opera.sem_num = SEM_PADRE;
opera.sem_op = 1;
semop ( semid, &opera, 1 );
}
semctl ( semid, 0, IPC_RMID, 0 );
}
else {
opera.sem_flg = 0;
while ( i ) {
opera.sem_num = SEM_PADRE;
opera.sem_op = -1;
semop ( semid, &opera, 1 );
printf ( “Proceso Padre: %d\n “, i– );
opera.sem_num = SEM_HIJO;
opera.sem_op = 1;
semop ( semid, &opera, 1 );
}
semctl ( semid, 0, IPC_RMID, 0 );
}
}
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#define SEM_HIJO 0#define SEM_PADRE 1main (int argc, int *argv[]) {int i = 10, semid, pid;struct sembuf opera;key_t llave;llave = ftok ( argv[0], ‘K’ );if ( ( semid = semget ( llave, 2, IPC_CREAT | 0666 ) ) == -1 ) {perror ( “semget” );exit ( -1 );}// Cerrar el Semaforo del Hijosemctl ( semid, SEM_PADRE, SETVAL, 0 );// Abrir el Semaforo del Padresemctl ( semid, SEM_PADRE, SETVAL, 1 );if ( ( pid = fork () ) == -1 ) {perror ( “fork “);exit ( -1 );}else if ( pid == 0 ) {while ( i ) {opera.sem_num = SEM_HIJO;opera.sem_op = -1;opera.sem_flg = 0;semop (semid, &opera, 1);printf ( “Proceso Hijo: %d\n “, i– );opera.sem_num = SEM_PADRE;opera.sem_op = 1;semop ( semid, &opera, 1 );}semctl ( semid, 0, IPC_RMID, 0 );}else {opera.sem_flg = 0;while ( i ) {opera.sem_num = SEM_PADRE;opera.sem_op = -1;semop ( semid, &opera, 1 );printf ( “Proceso Padre: %d\n “, i– );opera.sem_num = SEM_HIJO;opera.sem_op = 1;semop ( semid, &opera, 1 );}semctl ( semid, 0, IPC_RMID, 0 );}#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#define SEM_HIJO 0#define SEM_PADRE 1main (int argc, int *argv[]) {int i = 10, semid, pid;struct sembuf opera;key_t llave;llave = ftok ( argv[0], ‘K’ );if ( ( semid = semget ( llave, 2, IPC_CREAT | 0666 ) ) == -1 ) {perror ( “semget” );exit ( -1 );}// Cerrar el Semaforo del Hijosemctl ( semid, SEM_PADRE, SETVAL, 0 );// Abrir el Semaforo del Padresemctl ( semid, SEM_PADRE, SETVAL, 1 );if ( ( pid = fork () ) == -1 ) {perror ( “fork “);exit ( -1 );}else if ( pid == 0 ) {while ( i ) {opera.sem_num = SEM_HIJO;opera.sem_op = -1;opera.sem_flg = 0;semop (semid, &opera, 1);printf ( “Proceso Hijo: %d\n “, i– );opera.sem_num = SEM_PADRE;opera.sem_op = 1;semop ( semid, &opera, 1 );}semctl ( semid, 0, IPC_RMID, 0 );}else {opera.sem_flg = 0;while ( i ) {opera.sem_num = SEM_PADRE;opera.sem_op = -1;semop ( semid, &opera, 1 );printf ( “Proceso Padre: %d\n “, i– );opera.sem_num = SEM_HIJO;opera.sem_op = 1;semop ( semid, &opera, 1 );}semctl ( semid, 0, IPC_RMID, 0 );}}
