Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-09-2005, 16:30   #1
Corvo80
Member
 
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
[C e Linux] Problema con le pipe e le fork()

Salve a tutti, ho un problemino... Il seguente programma dovrebbe generare N processi figlio (nell'esempio N e'uguale a 2) e ciascuno di essi deve inviare separatamente al padre (che si occupa di gestire il servizio di stampa a video) due linee di testo del tipo "#x: linea 1" e "#x: linea 2", dove x e'l'identificativo del processo (da 1 a N). Tramite l'utilizzo dei semafori, si assicura che linee di diversi processi non possano essere stampati in maniera accavallata.

Codice:
#include "pv.h" /* Struttura che definisce i semafori */
#include <stdlib.h>
#include <time.h>
#define N 2 /* Numero di processi, definire a piacere */
#define R 1 /* Numero di iterazioni per processo, definire a piacere */

int p(int semid); /* Funzione di accesso alla sezione critica */
int v(int semid); /* Funzione di uscita dalla sezione critica */
int initsem(key_t skey); /* Funzione di inizializzazione del semaforo */
void handlesem(key_t skey, int i, int outp); /* Funzione di gestione del semaforo */

struct msgst {
	int proc; /* numero del processo */
	int line; /* numero della riga da stampare */
};

main() {
	key_t semkey = 0x200;
	int i;
	pid_t pid;
	int p[2];
	
	if(pipe(p)==-1) {
		perror("pipe call");
		exit(1);
	}
	
	for (i=1; i<=N; i++) { /* Crea N processi... */
		pid=fork();
		if  (pid == 0) {
			close(p[0]);
			struct msgst dati_msg;
			dati_msg.proc=i;
			dati_msg.line=1;
			handlesem(semkey, i, p[1]);
		}
		else if (pid > 0) {
			/* Processo padre */
			close(p[1]);
			struct msgst valore_letto;
			int j;
			for (j=1; j<=N*R*2; j++) {
				read(p[0],&valore_letto,sizeof(valore_letto));
				printf("# %i: linea %i\n", valore_letto.proc, valore_letto.line);
			}
		}
		else {
			printf("Si e' verificato un errore nella chiamata a fork.\n");	/* ... ERRORE */
			exit(2);
		}
	}
}

int initsem(key_t semkey) {
	int status = 0, semid;
	
	if((semid = semget(semkey, 1, SEMPERM | IPC_CREAT | IPC_EXCL)) == -1) { /* Crea un array di un semaforo e controlla che non si verifichino errori */
		if(errno == EEXIST)
			semid = semget(semkey, 1, 0);
	}
	else { /* Se tutto e'andato bene... */
		semun arg;
		arg.val = 1;
		status = semctl(semid, 0, SETVAL, arg); /* Inizializza il semaforo a valore 1 */
	}
	
	if(semid == -1 || status == -1) { /* Gestisci eventuali errori */
		perror("initsem fallita");
		return (-1);
	}
	
	return semid;
}

void handlesem(key_t skey, int proc, int outp) {
	int semid;
	pid_t pid = getpid();
	
	if((semid = initsem(skey)) < 0) /* Esci in caso di errore */
		exit(1);

	struct msgst dati_msg1;
	dati_msg1.proc=proc;
	dati_msg1.line=1;
	
	struct msgst dati_msg2;	
	dati_msg2.proc=proc;
	dati_msg2.line=2;

	int j;
	for (j = 1; j<=R; j++) { /* Ciascun processo ripete R volte... */
		/* prima della sezione critica */
		p(semid);
		/* all interno della sezione critica */
		write(outp,&dati_msg1,sizeof(dati_msg1)); /* Invia prima riga */
		write(outp,&dati_msg2,sizeof(dati_msg2)); /* Invia seconda riga */
		/* in procinto di abbandonare la sezione critica */
		v(semid);
		/* in procinto di terminare */
		srandom(time(0)+proc);
		sleep((int)random()%3+1); /* Dormi un tempo pseudocasuale */
	}
	exit(0); /* Fine */
}

int p(int semid) {
	struct sembuf p_buf;
	p_buf.sem_num = 0; /* Semaforo su cui effettuare l'operazione */
	p_buf.sem_op = -1; /* valore negativo: forma generalizzata della funzione p() */
	p_buf.sem_flg = SEM_UNDO; /* Valore predefinito */
	
	if(semop(semid, &p_buf, 1) == -1) { /* Gestisci eventuali errori */
		perror("p(semid) fallita");
		exit(1);
	}
	return(0);
}

int v(int semid) {
	struct sembuf v_buf;
	v_buf.sem_num = 0; /* Semaforo su cui effettuare l'operazione */
	v_buf.sem_op = 1; /* valore positivo: forma generalizzata della funzione v() */
	v_buf.sem_flg = SEM_UNDO; /* Valore predefinito */
	
	if(semop(semid, &v_buf, 1) == -1) { /* Gestisci eventuali errori */
		perror("v(semid) fallita");
		exit(1);
	}
	return(0);
}
Ecco il problema: dovrebbe risultare un output del tipo:

# 1: linea 1
# 1: linea 2
# 2: linea 1
# 2: linea 2

E invece risulta...

# 1: linea 1
# 1: linea 2
# 1: linea 2
# 1: linea 2
# 1: linea 2
# 1: linea 2
# 1: linea 2
# 1: linea 2

Dove sbaglio? Grazie della disponibilita'...
Corvo80 è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2005, 16:31   #2
Corvo80
Member
 
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
Mi sono dimenticato, questo e'il codice del file pv.h, necessario per far girare il programma...

Codice:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>
#define SEMPERM 0600
#define TRUE 1
#define FALSE 0

typedef union _semun {
	int val;
	struct semid_ds *buf;
	ushort *array;
} semun;
Corvo80 è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2005, 09:19   #3
Corvo80
Member
 
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
Nebbia completa?
Corvo80 è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2005, 20:55   #4
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Codice:
int main(void)
{
	key_t semkey = 0x200;
	int i, p[2];
	pid_t pid;
	struct msgst valore_letto;

	if (pipe(p) == -1) {
		perror("pipe call");
		exit(1);
	}
	for (i = 0; i < N; i++) {	/* Crea N processi... */
		pid = fork();
		if (pid < 0) {
			perror("fork call");
			exit(1);
		}
		if (pid == 0) {
			struct msgst dati_msg;

			close(p[0]);
			dati_msg.proc = i;
			dati_msg.line = 1;
			handlesem(semkey, i, p[1]);
			_exit(0);
		}
	}
	/* Processo padre */
	close(p[1]);
	for (i = 0; i < N * R * 2; i++) {
		read(p[0], &valore_letto, sizeof(valore_letto));
		printf("# %i: linea %i\n", valore_letto.proc,
		       valore_letto.line);
	}
	return 0;
}
Ricordati di togliere l'exit() da handlesem().
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 27-09-2005, 09:25   #5
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Se avessi controllato i valori di ritorno delle write e della read forse ci saresti arrivato da solo.
nb non vedo l'utilità del semaforo in questo contesto (e tra l'altro lo utilizzi in maniera errata, ad una prima occhiata)
Codice:
--- a.c.org	2005-09-27 09:32:18.000000000 +0200
+++ a.c	2005-09-27 09:32:50.000000000 +0200
@@ -36,10 +36,9 @@ main() {
 		}
 		else if (pid > 0) {
 			/* Processo padre */
-			close(p[1]);
 			struct msgst valore_letto;
 			int j;
-			for (j=1; j<=N*R*2; j++) {
+			for (j=1; j<=R*2; j++) {
 				read(p[0],&valore_letto,sizeof(valore_letto));
 				printf("# %i: linea %i\n", valore_letto.proc, valore_letto.line);
 			}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12

Ultima modifica di ilsensine : 27-09-2005 alle 09:29.
ilsensine è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
Funzionalità top a un prezzo acce...
Lo strumento per gli aggiornamenti autom...
Imperdibile sconto sul roborock Saros Z7...
Google Pixel 10, altri 100€ di sconto su...
Chip sotto i 2 nanometri, l'Europa alza ...
La smart meno smart di tutte: #6 in azio...
Red Hat Enterprise Linux sbarca su AWS E...
Addio alle migliaia di cicli e anni di t...
Colpo di STMicroelectronics, un'intesa d...
La Ferrari elettrica si chiama Luce: ecc...
Proseguono le riparazioni in vista del l...
Cinema domestico low cost: proiettore Fu...
Sharp porta a ISE 2026 i nuovi display i...
Casa più sicura senza lavori: Arl...
Batterie esauste, l'Italia raccoglie sol...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:25.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v