jfcmacro icon

crearProcSemPriv.cpp

jfcmacro | PRO | 03/14/19 08:16:06 PM UTC | 0 ⭐ | 373 👁️ | Never ⏰ | []
C++ |

1.5 KB

|

None

|

0 👍

/

0 👎

#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