Vorrei riaprire questo thread poichè continuo a riscontrare quest'anomalia nei miei programmi:
main:
#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <stdlib.h>
#include <unistd.h>
#include "func.h"
#include <wait.h>
using namespace std;
int main(){
pid_t pid;
//creo sem e lo inizializzo
int idSem = semget(IPC_PRIVATE, 2, IPC_CREAT | 0664);
semctl(idSem, spazioDisp, SETVAL, 1);
semctl(idSem, messDisp, SETVAL, 0);
//DEBUG
cout << "\n [DEBUG] Semaforo creato con ID: " << idSem << endl;
cout << "\n [DEBUG] spazioDisp inizializzato a : " <<
semctl(idSem,spazioDisp, GETVAL);
cout << "\n [DEBUG] messDisp inizializzato a : " <<
semctl(idSem,messDisp, GETVAL);
//creo shm
int idShm = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0664);
int * mess;
mess = (int*) shmat(idShm, 0, 0);
//creo i processi
int nProd = 5;
int nCons = 5;
int nProcess = nProd + nCons;
for (int i = 0 ; i < nProcess ; i++){
pid = fork();
if (pid == 0){
if(i % 2 == 0){
produttore(idSem,mess);
sleep(3);
}else{
consumatore(idSem,mess);
sleep(1);
}
_exit(0);
}
}
int status;
for (int i = 0 ; i < nProcess ; i++){
pid = wait(&status);
if(pid==-1)
cout<<"\nERRORE\n"<<endl;
else
cout<<"\nFiglio n.ro "<<pid<<" è morto con status "<<status<<endl;
}
//elimino sem e shm
semctl(idSem, 0 , IPC_RMID);
shmctl(idShm, IPC_RMID, 0);
cout<<endl<<endl;
}
func.cpp
#include "func.h"
#include <iostream>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
using namespace std;
void wait(int idSem, int semNum){
struct sembuf s;
s.sem_num = semNum;
s.sem_flg = 0;
s.sem_op = -1;
semop(idSem, &s, 1);
}
void signal(int idSem, int semNum){
struct sembuf s;
s.sem_num = semNum;
s.sem_flg = 0;
s.sem_op = 1;
semop(idSem, &s, 1);
}
void produttore(int idSem, int * mess){
wait(idSem, spazioDisp);
srand(time(NULL));
*mess = rand()% 10; //generare il seme con srand(time(NULL));
cout<<"\nProduttore ha generato : "<<*mess<<endl;
sleep(1);
signal(idSem,messDisp);
}
void consumatore(int idSem, int * mess){
wait(idSem,messDisp);
cout<<"\nConsumatore ha consumato : "<<*mess<<endl;
signal(idSem,spazioDisp);
}
func.h
#ifndef FUNC
#define FUNC
#define spazioDisp 0
#define messDisp 1
void wait(int, int);
void signal(int, int);
void produttore(int, int*);
void consumatore(int, int*);
#endif
ho in output:
[DEBUG] Semaforo creato con ID: 1671189
[DEBUG] spazioDisp inizializzato a : 1
[DEBUG] messDisp inizializzato a : 0
Produttore ha generato : 7
[DEBUG] messDisp inizializzato a : 0
Consumatore ha consumato : 7
[DEBUG] messDisp inizializzato a : 0
Produttore ha generato : 6
[DEBUG] messDisp inizializzato a : 0
[DEBUG] messDisp inizializzato a : 0
Figlio n.ro 8326 è morto con status 0
Consumatore ha consumato : 6
[DEBUG] messDisp inizializzato a : 0
Produttore ha generato : 3
Figlio n.ro 8328 è morto con status 0
[DEBUG] messDisp inizializzato a : 0
Consumatore ha consumato : 3
[DEBUG] messDisp inizializzato a : 0
Produttore ha generato : 7
Figlio n.ro 8325 è morto con status 0
[DEBUG] messDisp inizializzato a : 0
Consumatore ha consumato : 7
Figlio n.ro 8330 è morto con status 0
[DEBUG] messDisp inizializzato a : 0
Produttore ha generato : 4
Figlio n.ro 8327 è morto con status 0
[DEBUG] messDisp inizializzato a : 0
Figlio n.ro 8334 è morto con status 0
Consumatore ha consumato : 4
Figlio n.ro 8329 è morto con status 0
Figlio n.ro 8332 è morto con status 0
Figlio n.ro 8333 è morto con status 0
Figlio n.ro 8331 è morto con status 0
le frasi di DEBUG dovrebbe stamparle soltanto all'inizio, invece si ripete sempre una
[DEBUG] messDisp inizializzato a : 0
in ogni processo
continuo a non capirne il motivo