Torna indietro   Hardware Upgrade Forum > Software > Programmazione

MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
Abbiamo provato MSI PRO MAX EDGE AI+, un mini-PC professionale progettato per eseguire modelli di intelligenza artificiale in locale, senza dipendere dal cloud. Il sistema abbina il processore AMD Ryzen AI Max+ 395, 128 GB di memoria unificata e un telaio in alluminio da appena 4 litri, con l'obiettivo di offrire capacità di elaborazione elevate in un formato compatto.
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Il nuovo top di gamma vivo punta su un comparto fotografico particolarmente articolato, con un teleobiettivo da 200 megapixel e teleconvertitori esterni capaci di arrivare a 400 mm equivalenti. Lo abbiamo provato a Tenerife, mettendo alla prova fotocamere, prestazioni, autonomia e accessori. Ecco come si è comportato.
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
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


MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
SpaceX sceglie Qualcomm per la rete 5G t...
AMD mette la freccia e si prepara allo s...
Sony Santa Monica posticipa God of War L...
Il telescopio spaziale Swift è ri...
Black Friday HONOR, prezzi giù fi...
AliExpress sfida Amazon sui prezzi: e-bi...
Gemini sotto accusa in Ungheria: per l'a...
Windows 11 può girare sulla NPU invece d...
MediaWorld diventa cinese: l'UE dice s&i...
Akamai potenzia il proprio cloud con due...
Steam, Valve cambia le regole: le revisi...
Canva licenzia (anche) per colpa dell'IA...
Axerta: l’IA traina la crescita delle te...
Galaxy A38, la batteria cresce ma il pre...
Notifica su Facebook: 'Effettuerai la mi...
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: 07:02.


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