Torna indietro   Hardware Upgrade Forum > Software > Programmazione

AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D è la nuova CPU gaming di riferimento grazie alla 3D V-Cache di seconda generazione e frequenze fino a 5,6 GHz. Nei test offre prestazioni superiori a 9800X3D e 7800X3D, confermando la leadership AMD nel gaming su PC.
Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-09-2013, 17:24   #1
Tuttola85
Junior Member
 
Iscritto dal: Sep 2013
Messaggi: 3
Primitiva dup() UNIX

Ciao a tutti!
Scrivo perchè non ho capito a cosa serve la pimitiva dup() (UNIX - Linguaggio C). Mi spiego meglio:

Codice:
#include <unistd.h>
retval=dup(fd);
int fd;
int retval;
Ho capito che fd è il file descriptor da duplicare e che retval è il nuovo file descriptor (con il numero più basso possibile nel sistema). Ma quando devo usarlo?

Vi posto un testo d'esame e la soluzione che dà la Prof.ssa. Qualcuno sa spiegarmi l'uso della dup()? Si poteva risolvere l'esercizio senza usarla?
GRAZIE MILLE!!

Testo:
Quote:
...La parte C accetta un numero variabile di parametri (N) che rappresentano nomi di fle (F1, F2, ... , FN). Il processo padre deve generare N processi figli (P0, P1, ... PN-1): ogni processo figlio è associato al corrispondente file Fi. Ognuno di tali processi figli deve, usando in modo opportuno il comando head di UNIX/Linux, leggere la prima linea del file associato; tale linea deve essere quindi comunicata al padre. Per ogni figlio, il padre ha il compito di stampare su standard output, rispettando l'ordine dei file, l'indce del processo figlio, il nome del file corrispondente e la linea ricevuta. Al termine, ogni processo figlio deve ritornare al padre il valore di ritorno della head e il padre deve stampare su standard output il PID di ogni figlio e il valore ritornato.
Soluzione:
Codice:
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

typedef int pipe_t[2];
int main(int argc, char **argv) {

/* -------- Variabili locali ---------- */
int pid; 
int N; 
int status;
pipe_t *piped;
int i, j;
char ch;

/* ------------------------------------ */

/* Controllo sul numero di parametri */
if (argc < 2) /* Meno di due parametri */ {
printf("Errore nel numero dei parametri\n");
exit(1); }

/* Calcoliamo il numero di file passati */
N = argc - 1;

/* Allocazione dell'array di N pipe descriptors*/
piped = (pipe_t *) malloc (N*sizeof(pipe_t)); if (piped == NULL)
{
printf("Errore nella allocazione della memoria\n");
exit(2); }

/* Creazione delle N pipe padre-figli */
for (i=0; i < N; i++) {
}
if(pipe(piped[i]) < 0) {
printf("Errore nella creazione della pipe\n");
exit(3); }

/* Ciclo di generazione dei figli */
for (i=0; i < N; i++) {
if ( (pid = fork()) < 0) {
printf("Errore nella fork\n");
exit(4); }
if (pid == 0) {
/* codice del figlio */
printf("Sono il processo figlio di indice %d e pid %d sto per
leggere la prima linea del file %s\n", i, getpid(), argv[i+1]);

/* ogni figlio deve simulare il piping dei comandi
nei confronti del padre e quindi deve chiudere lo
standard output e quindi usare la dup sul lato di
scirttura della propria pipe */

close(1);
dup(piped[i][1]);

/* Chiusura di tutte le pipe */
for (j=0; j < N; j++) {
close(piped[j][0]);
close(piped[j][1]);
}

/* Ridirezione dello standard error su /dev/null
(per evitare messaggi di errore a video)*/
close(2);
open("/dev/null", O_WRONLY);

/* Il figlio diventa il comando head */
execlp("head", "head", "-1", argv[i+1], (char *)0);

/* Non si dovrebbe mai tornare qui!!*/
exit(1); /* torno un valore diverso da zero per indicare insuccesso*/
}
}

/* Codice del padre */
for (i=0; i < N; i++)
close(piped[i][1]);

/* Il padre recupera le informazioni dai figli in ordine di indice */
for (i=0; i < N; i++) {
printf("Il figlio di indice %d ha letto dal file %s la linea:\n", i,
argv[i+1]);

do
{
read(piped[i][0], &ch, 1);
printf("%c", ch);
}
while (ch != '\n');
}

/* Il padre aspetta i figli in ordine di indice */
for (i=0; i < N; i++) {
pid = wait(&status);

if (pid < 0)
{
printf("Errore in wait\n");
exit (5);
}

if ((status & 0xFF) != 0)
printf("Figlio con pid %d terminato in modo anomalo\n", pid);
else
printf("Il figlio con pid=%d ha ritornato %d\n", pid, (int)((status >> 8) & 0xFF));
La parte in grassetto è quella in cui mi perdo!!
Tuttola85 è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2013, 18:08   #2
Tuttola85
Junior Member
 
Iscritto dal: Sep 2013
Messaggi: 3
...Provando a ragionare...

Chiude lo standard output
Codice:
close(1);
quindi le pipe
Codice:
piped[i][1]
sono aperte in scrittura ed associate al file descriptor 1.
Questo significa che tutto quello che scrivo sulle pipe mi viene visualizzato anche sullo stadard output??

E' a questo che serve la dup()?

GRAZIE!
Tuttola85 è offline   Rispondi citando il messaggio o parte di esso
Old 08-09-2013, 16:41   #3
Tuttola85
Junior Member
 
Iscritto dal: Sep 2013
Messaggi: 3
Nessuno sa darmi una mano?
Tuttola85 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Booking.com e OpenAI annunciano SME AI A...
Xiaomi SU7 Ultra: da domani tutti i gioc...
Sharp Inspire Expo 2026: da produttore d...
Razer Synapse Web è realtà...
Concessionarie Audi chiudono improvvisam...
Resident Evil Requiem: 4K, 60 FPS e ray ...
Le batterie LFP sono piccole e pesanti? ...
Motorola inarrestabile: nuova serie moto...
Decima generazione Pokémon: grafi...
Una nuova legge consente di rottamare un...
Google mostra per sbaglio Android per PC...
Tesla non convince più: crolla il...
OpenAI lancia Prism: l'AI ora lavora fia...
Nissan mette i pannelli solari su Ariya:...
Day 3 a Barcellona: la prima di Norris c...
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: 04:46.


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