Difference between revisions of "ProvaPratica 2013.01.25"
Jump to navigation
Jump to search
(Created page with "Esercizio 1 <syntaxhighlight lang="C"> /* http://www.cs.unibo.it/~renzo/so/pratiche/2013.01.25.pdf Scrivere un programma listexe che fornisca in output l'elenco dei process...") |
m (Aggiunta soluzione di un'altro studente e migliorata organizzazione pagina.) |
||
(One intermediate revision by one other user not shown) | |||
Line 1: | Line 1: | ||
− | Esercizio 1 | + | ==Esercizio 1== |
+ | ===Soluzione di GiuliaN.=== | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
/* | /* | ||
Line 60: | Line 61: | ||
Non so se è corretto, ma sembra funzionare, però stampa anche directory che non credo vadano bene... | Non so se è corretto, ma sembra funzionare, però stampa anche directory che non credo vadano bene... | ||
− | + | ||
+ | ===Soluzione di ababa=== | ||
+ | <source lang="c"> | ||
+ | #include <sys/types.h> | ||
+ | #include <sys/stat.h> | ||
+ | #include <unistd.h> | ||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <error.h> | ||
+ | #include <fcntl.h> | ||
+ | #include <string.h> | ||
+ | #include <dirent.h> | ||
+ | |||
+ | int main(void){ | ||
+ | |||
+ | int pid,max_size=10000; | ||
+ | char *path, *dove=malloc(max_size); | ||
+ | path="/proc"; | ||
+ | size_t size=max_size; | ||
+ | struct dirent **namelist; | ||
+ | int n; | ||
+ | int c=0; | ||
+ | n = scandir(path, &namelist, 0, alphasort); | ||
+ | if (n < 0){ | ||
+ | perror("scandir"); | ||
+ | } | ||
+ | else{ | ||
+ | while(n--){ | ||
+ | |||
+ | DIR *cartella; | ||
+ | path=malloc(1000); | ||
+ | path[0]='\0'; | ||
+ | strcat(path,"/proc/"); | ||
+ | strcat(path,namelist[n]->d_name); | ||
+ | //printf("%s\n",path); | ||
+ | cartella=opendir(path); | ||
+ | |||
+ | if (cartella != NULL){ | ||
+ | strcat(path,"/exe"); | ||
+ | readlink(path,dove,size); | ||
+ | pid=atoi(namelist[n]->d_name); | ||
+ | if (pid!=0){ | ||
+ | printf("%s ha pid: %d il path %s\n",namelist[n]->d_name,pid,dove); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | free(path); | ||
+ | } | ||
+ | printf("%d",c); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> |
Latest revision as of 08:13, 9 May 2017
Esercizio 1
Soluzione di GiuliaN.
/*
http://www.cs.unibo.it/~renzo/so/pratiche/2013.01.25.pdf
Scrivere un programma listexe che fornisca in output l'elenco dei processi attivi nel sistema mettendo in output per ogni
processo il pid e il path dell'eseguibile.
L'informazione puo' essere trovata scandendo la directory proc, infatti ad ogni processo attivo corrisponde una directory in
/proc che ha come nome il numero del processo (ad esempio al processo 9801 corrisponde la directory /proc/9801) e all'interno
di queste directory il file exe e' un link simbolico all'eseguibile.
Esempio:
$ ls -l /proc/9801/exe
lrwxrwxrwx 1 renzo renzo 0 Jan 22 18:26 /proc/9801/exe -> /bin/bash
l'output del programma listexe dovrebbe essere:
$ listexe
.....
9801 /bin/bash
9933 /usr/bin/vim
.....
(alcuni link simbolici possono essere non leggibili per sicurezza, verranno omessi).*/
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[]){
struct dirent **namelist;
int n;
struct stat buf;
char dir[1024];
char path[1024];
char exe[1024];
n = scandir("/proc", &namelist, NULL, 0);
if(n<0)
perror("scandir");
else{
while(n--){
sprintf(dir, "/proc/%s",namelist[n]->d_name);
stat(dir,&buf);
if(S_ISDIR(buf.st_mode)){
sprintf(path, "%s/exe",dir);
readlink(path, exe, 1024);
printf("%s %s\n",namelist[n]->d_name,exe);
free(namelist[n]);
}
}
free(namelist);
}
}
Non so se è corretto, ma sembra funzionare, però stampa anche directory che non credo vadano bene...
Soluzione di ababa
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <fcntl.h>
#include <string.h>
#include <dirent.h>
int main(void){
int pid,max_size=10000;
char *path, *dove=malloc(max_size);
path="/proc";
size_t size=max_size;
struct dirent **namelist;
int n;
int c=0;
n = scandir(path, &namelist, 0, alphasort);
if (n < 0){
perror("scandir");
}
else{
while(n--){
DIR *cartella;
path=malloc(1000);
path[0]='\0';
strcat(path,"/proc/");
strcat(path,namelist[n]->d_name);
//printf("%s\n",path);
cartella=opendir(path);
if (cartella != NULL){
strcat(path,"/exe");
readlink(path,dove,size);
pid=atoi(namelist[n]->d_name);
if (pid!=0){
printf("%s ha pid: %d il path %s\n",namelist[n]->d_name,pid,dove);
}
}
free(path);
}
printf("%d",c);
}
}