Fork, schedulazione e priorità.... su quale processo?

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
SoldatoSemplice
Prode Principiante
Messaggi: 63
Iscrizione: martedì 11 dicembre 2007, 12:03

Fork, schedulazione e priorità.... su quale processo?

Messaggio da SoldatoSemplice »

Ciao a tutti, ho da poco comprato un manuale che tratta la programmazione esclusivamente in Linux dove spiega i prototipi di tre funzioni che mi interessano particolarmente:
La fork() per clonare un processo e la relativa execve per assegnarli un nuovo esecutivo, la schedulazione e la routine per modificare priorità e cortesia di un processo, il bello è che sul manuale è spiegato per bene il prototipo con le librerie da includere in un codice C, solo che non ho capito/non spiega bene come si fa ad assegnare la fork ad un determinato processo, in pratica se io ho nella mia process table tipo 4 o 5 processi con relativi PID come faccio ad usare una fork per clonare ad esempio il terzo o il quarto? In pratica come faccio ad assegnare la fork o la SetPriority ad un processo che scelgo io?

Grazie dell'aiuto

Ciao

Leo
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: Fork, schedulazione e priorità.... su quale processo?

Messaggio da mous16 »

non so se si può fare su dei processi preesistenti: l'unico utilizzo che conosco di fork è se uno scrive un codice come il seguente:

Codice: Seleziona tutto

int main(argv, argc[])
{
   int a;
   pid_t pid=0;
   pid=fork()
   if(pid)
   {
      /*codice del figlio con eventuale exec*/
   }
   else
   {
      /*codice del padre*/
   }
   return 0;
}
Così facendo cloni il processo padre, e hai due processi con due copie della variabile a. se nel figlio (o nel padre) esegui una exec, perdi tutti i dati clonati dal padre e li sostituisci con quelli del nuovo processo che lanci
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: Fork, schedulazione e priorità.... su quale processo?

Messaggio da bite »

Anche a me risulta che ogni processo possa fare solo una fork di se stesso.
SoldatoSemplice
Prode Principiante
Messaggi: 63
Iscrizione: martedì 11 dicembre 2007, 12:03

Re: Fork, schedulazione e priorità.... su quale processo?

Messaggio da SoldatoSemplice »

Si è giusto, ma metti caso che io faccio un programma che ha tre diversi processi: magari uno fà una stampa sullo standard output, un altro legge dalla seriale e un'altro scrive su un file con fprintf, e io voglio tipo modificare la posizione di uno dei tre nello schedulatore o modificare la priorita ad esempio di quello che legge dalla seriale in una priorità più alta, come faccio a distinguere una volta che mi trovo dentro il mio eseguibile dove fare la fork o la SetPriority per aumentare la priorità del lettore della seriale?

Spero di essermi spiegato, in pratica come discrimino i processi?

Ah aspetta mi pareva di averlo letto; secondo voi potrebbe essere una cosa del genere: Uso GetPid e GetPPID per ottenere PID e PID del padre del processo che legge la seriale e poi agganciandomi al suo PID gli aumento la priorità o lo forko, potrebbe essere?
Al momento non ho esempi, ma anche qualora fosse così sorge un altro dubbio, come riesco a scoprire il PID del processo che legge la seriale? In pratica io Con GetPid ottengo il PID di uno dei processo ma come discrimino se è il processo che legge?

Quando apro la porta seriale con

Codice: Seleziona tutto

 fd = open("/dev/ttyS0"......

percaso il nome del processo che genero coincide con il descrittore del file, cioè fd?
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: Fork, schedulazione e priorità.... su quale processo?

Messaggio da mous16 »

allora non so come aumentare la priorità di un processo, però tieni conto che:
1) i processi su linux si identificano per PID (Proces IDentifier). per ottenere il pid di un processo ci sono vari modi, di cui l'unico che so usare è il fork stesso. ecco il prototipo della fork:

Codice: Seleziona tutto

pid_t fork(void);
Notare che ritorna un valore di tipo pid_t 8che poi non è altro che una define su un int). Dopo la fork, ci sono due processi: nel padre la fork ritorna il PID del figlio appena creato, mentre nel figlio ritorna 0. Ovviamente esistono anche altri modi per ottenere il PID di un processo.
2) per aprire le porte seriali le istruzioni sono un pochino più complesse, ma l'idea è quella.

Se ti interessa contattami in privato, che ti mando il sorgente di un programmino che avevo scritto che tratta proprio di seriali e fork!
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti