O programa removebig
remove de um diretório todos os ficheiros regulares cujo tamanho seja superior a um dado valor. Os argumentos do programa são o nome do diretório e o referido tamanho (exemplo de invocação para remover os ficheiros do diretório dir1
cujo tamanho seja superior a 1000000: removebig dir1 1000000
). Nota: os subdiretórios devem ser ignorados.
a) Escreva a parte do código de removebig que percorre o referido diretório e, por cada ficheiro encontado cujo tamanho seja superior ao indicado, escreve o nome do ficheiro na saída padrão, incrementa um contador do número de ficheiros a remover (variável count
) e invoca a função void remove(char *filename)
, cujo parâmetro é o nome do ficheiro a remover. Não implemente por enquanto esta função.
b) Escreva o código da função remove()
que remove o ficheiro cujo nome recebe como parâmetro, recorrendo para isso a um subprocesso (processo filho) que executa o utilitário rm
. Nota: não use chamadas system()
.
c) Escreva a parte do código de removebig que espera que todos os processos filhos terminem e escreve na saída padrão o número total de ficheiros removidos.
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int rmcount = 0;
// Pergunta 3.b.
int removefile(char* filename){
char *const args[] = {"rm", filename, (char *)0};
execv("/bin/rm", args);
}
int main(int argc, char *argv[])
{
DIR *dir;
struct dirent *entry;
struct stat statbuf;
if (!(dir = opendir(argv[1])))
return 1;
// Pergunta 3.a.
while ((entry = readdir(dir)) != NULL)
{
stat(entry->d_name, &statbuf);
//printf("%ld\n", statbuf.st_size);
if (S_ISREG(statbuf.st_mode) && statbuf.st_size > atoi(argv[2]))
{
printf("%s\n", entry->d_name);
rmcount++;
if (fork() == 0)
{
//Visto que não eram dadas instruções especificas de
//onde seria executado o programa, tanto podia ser passado
//apenas o entry-d_name, como o path construido.
//
// char *const args[] = {"rm", entry->d_name, (char *)0};
// execv("/bin/rm", args);
//ou
char *fullpath = malloc(strlen(argv[1])+strlen(entry->d_name)+1);
sprintf(fullpath, "%s/%s", argv[1], entry->d_name);
removefile(fullpath);
}
}
}
// Pergunta 3.c.
pid_t kidpid;
int status;
while ((kidpid = wait(&status)) > 0){}
printf("%d", rmcount);
}
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int rmcount = 0;
// Pergunta 3.b.
int removefile(char* filename){
if (fork() == 0){
char *const args[] = {"rm", filename, (char *)0};
execv("/bin/rm", args);
}
}
int main(int argc, char *argv[])
{
DIR *dir;
struct dirent *entry;
struct stat statbuf;
if (!(dir = opendir(argv[1])))
return 1;
// Pergunta 3.a.
while ((entry = readdir(dir)) != NULL)
{
stat(entry->d_name, &statbuf);
//printf("%ld\n", statbuf.st_size);
if (S_ISREG(statbuf.st_mode) && statbuf.st_size > atoi(argv[2]))
{
printf("%s\n", entry->d_name);
rmcount++;
//Visto que não eram dadas instruções especificas de
//onde seria executado o programa, tanto podia ser passado
//apenas o entry-d_name, como o path construido.
//ou
char *fullpath = malloc(strlen(argv[1])+strlen(entry->d_name)+1);
sprintf(fullpath, "%s/%s", argv[1], entry->d_name);
removefile(fullpath);
}
}
// Pergunta 3.c.
pid_t kidpid;
int status;
while ((kidpid = wait(&status)) > 0){}
printf("%d", rmcount);
}