Lo que sucede es que dentro del ciclo, tu tienes en
dirp->d_name el nombre de cada entrada ubicada en el directorio especificado por
ruta, pero ese nombre es relativo a esa ruta. Entonces, si ejecutas el programa desde una carpeta diferente de "/bin" (o aquella que definas en
ruta), las llamadas a stat() pensarán que estás buscando esos archivos en la carpeta actual, y si no existen, devuelve un valor de error (que tu programa no verifica).
Un ejemplo de cómo podría evitarse este problema sería construir la ruta completa a pasarle a stat(), concatenando las diferentes partes de la ruta:
Código:
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#define TAM_RUTA 1024
int main()
{
DIR *dir_act;
struct dirent *dirp;
struct stat fich;
char nombre[TAM_RUTA + 1];
char *ruta= "/bin";
int arch_gid;
double siz_arch;
size_t ruta_tam;
if((dir_act = opendir(ruta)) == NULL)
printf("Error al abrir el directorio\n");
ruta_tam = strlen(ruta);
while((dirp = readdir(dir_act)) != NULL){
/* Empezar con la ruta base */
strncpy(nombre, ruta, TAM_RUTA);
/* Pegar un separador de directorio */
strncat(nombre, "/", TAM_RUTA - ruta_tam);
/* Y finalmente unir con el nombre del archivo actual */
strncat(nombre, dirp->d_name, TAM_RUTA - ruta_tam - 1);
printf("El nombre del archivo es : %s\n" , nombre );
stat(nombre,&fich);
arch_gid = fich.st_gid;
siz_arch= fich.st_size;
printf("GID -> %d \n", arch_gid);
printf("tamaño -> %.0f \n", siz_arch);
}
closedir(dir_act);
}
P.D: Quité un par de llamadas a readdir() de más, que producían que más o menos la mitad de los archivos no fueran listados. No sé si lo hacías por una razón especial, pero este ejemplo trata de hacer lo que te entendí que querías :)