#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include <unistd.h>
#include <cstdlib>
#include <cstring>
#include <cerrno>
using namespace std;
static void cliente(int semid);
static void servidor(int semid);
int
main(int argc, char *argv[]) {
int semid = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | 0660 );
if (semid == -1) {
cerr << "Error creando el semaforo: " <<
strerror(errno) << endl;
return EXIT_FAILURE;
}
cout << "Semid: " << semid << endl;
int val = 0;
if (semctl(semid, 0, SETVAL, val) == -1) {
cerr << "Error establecer valor: "
<< semid << " debido a "
<< strerror(errno) << endl;
return EXIT_FAILURE;
}
pid_t hijoSrv, hijoCln;
if ((hijoSrv = fork()) == 0) {
servidor(semid);
}
else if ((hijoCln = fork()) == 0) {
cliente(semid);
}
int status;
wait(&status);
wait(&status);
return EXIT_SUCCESS;
}
static void usage(const char *progname) {
cerr << "Uso: " << progname << " <semkey> "
<< endl;
exit(EXIT_FAILURE);
}
static void cliente(int semid) {
for (;;) {
sleep(10);
struct sembuf op[1];
op[0].sem_num = 0;
op[0].sem_op = 1;
op[0].sem_flg = 0;
semop(semid, op, 1);
}
}
static void servidor(int semid) {
for (;;) {
struct sembuf op[1];
op[0].sem_num = 0;
op[0].sem_op = -1;
op[0].sem_flg = 0;
cout << "Esperando para imprimir" << endl;
semop(semid, op, 1);
cout << "Impresion lista" << endl;
}
}
Comments