jfcmacro

crearProcSemPriv.cpp

Mar 14th, 2019
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <sys/types.h>
  3. #include <sys/ipc.h>
  4. #include <sys/sem.h>
  5. #include <sys/wait.h>
  6. #include <unistd.h>
  7. #include <cstdlib>
  8. #include <cstring>
  9. #include <cerrno>
  10.  
  11. using namespace std;
  12.  
  13. static void cliente(int semid);
  14. static void servidor(int semid);
  15.  
  16. int
  17. main(int argc, char *argv[]) {
  18.  
  19.   int semid = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | 0660 );
  20.  
  21.   if (semid == -1) {
  22.     cerr << "Error creando el semaforo: " <<
  23.       strerror(errno) << endl;
  24.     return EXIT_FAILURE;
  25.   }
  26.  
  27.   cout << "Semid: " << semid << endl;
  28.  
  29.   int val = 0;
  30.  
  31.   if (semctl(semid, 0, SETVAL, val) == -1) {
  32.     cerr << "Error establecer valor: "
  33.      << semid << " debido a "
  34.      << strerror(errno) << endl;
  35.     return EXIT_FAILURE;
  36.   }
  37.  
  38.   pid_t hijoSrv, hijoCln;
  39.  
  40.   if ((hijoSrv = fork()) == 0) {
  41.     servidor(semid);
  42.   }
  43.   else if ((hijoCln = fork()) == 0) {
  44.     cliente(semid);
  45.   }
  46.  
  47.   int status;
  48.  
  49.   wait(&status);
  50.   wait(&status);
  51.  
  52.   return EXIT_SUCCESS;
  53. }
  54.  
  55. static void usage(const char *progname) {
  56.   cerr << "Uso: " << progname << " <semkey> "
  57.        << endl;
  58.   exit(EXIT_FAILURE);
  59. }
  60.  
  61. static void cliente(int semid) {
  62.  
  63.   for (;;) {
  64.     sleep(10);
  65.       struct sembuf op[1];
  66.  
  67.       op[0].sem_num = 0;
  68.       op[0].sem_op = 1;
  69.       op[0].sem_flg = 0;
  70.       semop(semid, op, 1);
  71.   }
  72. }
  73.  
  74. static void servidor(int semid) {
  75.  
  76.   for (;;) {
  77.     struct sembuf op[1];
  78.     op[0].sem_num = 0;
  79.     op[0].sem_op = -1;
  80.     op[0].sem_flg = 0;
  81.  
  82.     cout << "Esperando para imprimir" << endl;
  83.     semop(semid, op, 1);
  84.     cout << "Impresion lista" << endl;
  85.   }
  86. }
Advertisement
Add Comment
Please, Sign In to add comment