|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
[C e Linux] Come si fa?
Salve a tutti, premesso che sono solo alle prime armi con la programmazione in C mi chiedevo se poteste darmi una mano. Essenzialmente dovrei scrivere un semplice programmino che stampi sullo schermo un istogramma orizzontale del numero di processi per ogni utente, del tipo:
root: ****** mario: *** antionio: **** etc... Sia chiaro: non voglio che mi facciate voi il programma, vorrei solo qualche dritta dato che sto navigando in alto mare. Vi ringrazio per qualunque consiglio possiate offrirmi. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
in queste cose io non sono molto esperto,però mi sembra una cosa simile al comando ps con le relative opzioni.Di sicuro c'è il sorgente a disposizione,potresti utilizzarlo come base per il tuo studio.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Dai una occhiata in /proc, alle sottodirectory con un numero come nome. Ciascuna corrisponde a un processo, e il proprietario della directory è il proprietario del processo.
__________________
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 |
|
|
|
|
|
#4 | ||
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Quote:
Quote:
|
||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
ps non è una syscall, ma puoi invocarlo da programma e reindirizzarne l'output su un descrittore aperto dal programma. Stessa cosa puoi fare con top.
Poi però devi interpretare da programma l'output, che è stampato in un formato umanamente leggibile.
__________________
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 |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Ok ho elaborato un'idea di algoritmo (in linguaggio ipotetico), ditemi se concettualmente può fungere:
1) Stampa il risultato di ps a file1 (con tutte le opzioni necessarie) 2) Pulisci file1 in modo da lasciare solo gli username (1 riga per ogni processo) 3) Considera il primo user 4) Richiamo a comando shell "grep" per sapere quante volte esso compare nel file, ovvero quanti processi ci sono per quell'user. 5) Append a file2 del tipo: "tizio: *********** " tramite ciclo for e a capo. 6) Cancella le prime righe su file1 (quelle dell'user precedentemente trovato) 7) Se file1 non è vuoto torna a punto 3) [ovviamente parliamo di programmazione strutturata quindi questa schifezza verrà tradotta in un ciclo while... ^_^] 8) Stampa a schermo file2 |
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
__________________
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 |
||
|
|
|
|
|
#8 | ||
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Quote:
Quote:
|
||
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Ok ho fatto. Il programma è funzionante anche se un po'sporco... Ora però dovrei apportare una modifica:
dovrei fare in modo che esso accetti come argomento un nome utente particolare e, in questo caso, stampare una stringa del tipo: "utente tizio n processi" Ovviamente devo fare riferimento ad argc per sapere se ci sono argomenti e ad argv[1] per leggere il primo, il problema è che non riesco a comparare la stringa contenuta in argv[1] con l'array di caratteri che leggo dal file... Qualche idea? |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
ps uxU pippo
Restituisce solo i processi dell'utente pippo
__________________
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 |
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Quote:
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Formatti con snprintf la stringa da passare alla chiamata system/exec.
__________________
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 |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Grazie, credo fosse la risposta che cercavo. Ora purtroppo devo uscire ma questo pomeriggio provo.
PS Devo includere qualche libreria particolare? |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Codice:
#include <ilsensine.h>
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Ok grazie ancora.
Qualcuno mi spiega la sintassi di snprintf e sprintf? (n° e tipo di argomenti, come si usa, etc...) purtroppo non ho un manuale di C, ho provato a cercare in Internet ma non ho trovato... |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: May 2003
Città: Trieste, Pordenone
Messaggi: 920
|
Quote:
Tra sprintf e snprintf ti consiglio sempre la seconda. PS: Occhio ai buffer overflow!
__________________
buy here |
|
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Come al solito siete stati gentilissimi.
Ora la prova del nove... Se ho capito bene, per far si' che la stringa contenuta in argv[1] sia formattata e reperibile dovro- scrivere: sprintf(argomento, argv[1]); essendo argomento un puntatore a caratteri, giusto? |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: May 2003
Città: Trieste, Pordenone
Messaggi: 920
|
Manca il formato.
sprintf(argomento, formato, variabile); sprintf(argomento, "%s", argv[1]); Ovviamente argomento dovrà contenere abbastanza spazio, sia che l'allocazione sia stata fatta staticamente che dinamicamente. Se hai bisogno di un maggiore controllo sugli argomenti passati da linea di comando, ti consiglio di guardare anche getopt(): http://www.die.net/doc/linux/man/man3/getopt.3.html
__________________
buy here Ultima modifica di fantoibed : 24-08-2005 alle 16:28. |
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
segmentation fault
|
|
|
|
|
|
#20 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Ok mi sembra di impazzire: ho risolto il problema della segmentation fault ma ora ho un altro problema:
ho lanciato il programma con argomento knoppix: a.out knoppix ora, fila tutto liscio come l'olio fino a... if (argomento == outp) { ... } ma il risultato della condizione e' false questo non ha senso, ho anche provato a far stampare i valori di argomento e outp prima del check e sono identici! Come mai?!!! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:46.



















