[Previo por Fecha] [Siguiente por Fecha] [Previo por Hilo] [Siguiente por Hilo]

[Hilos de Discusión] [Fecha] [Tema] [Autor]

Re: [Ayuda] Ayuda para programar ls y ps



Bueno gracias a todos por los comentarios, me han ayudado, pero ahora tengo un problema, voy apenas con el comando ls, como le hago para ordenar la salida o bueno los arvhivos que se imprimen.

Les mando mi código

Gracias

Arturo Espinosa-Aldama escribió:

From: Victor Antonio González Chávez <00458115 en academ01 cem itesm mx>
To: ayuda en linux org mx
Subject: [Ayuda] Ayuda para programar ls y ps
Date: Tue, 14 Oct 2003 18:46:49 -0600

Hola alguien me podria ayudar, me pidieron programar las instrucciones ls con parametros ( a, F, l, t ) y la de ps con parametros (e, f) , pero no tengo ninguna idea de como empezar, me podrian dar ideas, de como irle haciendo, la verdad no soy muy bueno programando y me cuesta trabajo hacer esta clase de programas.


Pues checa el manual de los comandos primero, pero basicamente, el centro absoluto de estos comandos son, para ls, la funcion stat y para ps, el contenido del subdirectorio /proc.

En el caso de ls, con opendir/readdir/closedir puedes checar el contenido de un subdirectorio, para luego usar stat con cada archivo y printf para mostrar la informacion.

El caso de ps es todavia mas facil, ya que solo tienes que checar /proc/[0-9]* y mostrar la informacion que leas alli. Incluso podrias implementarlo en shell, en vez de C.

man ls
man ps
man 2 stat
man 5 proc
man 3 opendir

Saludos,
Arturo

_________________________________________________________________
STOP MORE SPAM with the new MSN 8 and get 2 months FREE* http://join.msn.com/?page=features/junkmail



/* Programa que lista los archivos de un directorio */

#include <stdio.h>
#include <stdlib.h> 
#include <strings.h>
#include <dirent.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
int	aflg, lflg, sflg, tflg, fflg, simflg, argcflg;

void revisa_dir(dir)
char *dir;
{
  DIR *dirp;
  struct dirent *direntp;
  struct stat statbuf;

  if ((dirp = opendir(dir)) == NULL) {
    fprintf(stderr,"No se pudo abrir el directorio de trabajo,por error %d \n",
               errno); 
    exit(1);
  }

  while ( (direntp = readdir( dirp )) != NULL ) {
      if (aflg){
      		stat(direntp->d_name, &statbuf);
      		if(simflg){
      			printf("%s\n",direntp->d_name);	
      		}
      		else{
     			printf("%s",direntp->d_name);
     			}
     			if(fflg == 1){
     				if (statbuf.st_mode & S_IFDIR)
       				printf("/ \f");
     				else
       			if (statbuf.st_mode & S_IFMT) 
       		  	 printf("* \f");
      		 	else
         			 printf("? \f");
     			}
		}
		else{  	  
			if ( *direntp->d_name != '.'){
  	  			stat(direntp->d_name, &statbuf);
  	  			if(simflg){
      			printf("%s\n",direntp->d_name);
      		}
      		else{
     			printf("%s",direntp->d_name);
     			}
     			if(fflg == 1){
     				if (statbuf.st_mode & S_IFDIR)
       				printf("/ \f");
     				else
       			if (statbuf.st_mode & S_IFMT) 
       		  	 printf("* \f");
      		 	else
         			 printf("? \f");
     			}
     		}
     	}
  }
  closedir(dirp);
  printf("\n");
  exit(0);

}
void lista_largo(dir)
char *dir;
{
  DIR *dirp;
  struct dirent *direntp;
  struct stat statbuf;

  if ((dirp = opendir(dir)) == NULL) {
    fprintf(stderr,"No se pudo abrir el directorio de trabajo,por error %d \n",
               errno); 
    exit(1);
  }

  while ( (direntp = readdir( dirp )) != NULL ) {
  		stat(direntp->d_name, &statbuf);
  		if (aflg){
  			printf("%d \f", statbuf.st_mode);
     		printf("%s \f",direntp->d_name);
     		printf("%d \f", statbuf.st_nlink);
     		printf("%d \f", statbuf.st_uid);
     		printf("%d \f", statbuf.st_gid);     
     		printf("%d \f",statbuf.st_size);
     		printf("%s \f", ctime(&statbuf.st_mtime));
     		printf("%s \n",direntp->d_name);
     	}
     	else{
     		if ( *direntp->d_name != '.'){
			printf("%d \f", statbuf.st_mode);
     		printf("%d \f", statbuf.st_nlink);
     		printf("%d \f", statbuf.st_uid);
     		printf("%d \f", statbuf.st_gid);     
     		printf("%d \f",statbuf.st_size);
     		printf("%s \f", ctime(&statbuf.st_mtime));
     		printf("%s \n",direntp->d_name);
     		}
     	}
  }
  closedir(dirp);
  printf("\n");
  exit(0);

}
void procesa_util(int argc, char *argv[])
{
	aflg = 0;
	lflg = 0;
	sflg = 0;
	tflg = 0;
	fflg = 0;
	simflg = 0;
	argcflg = 0;

	if (argc == 1) {
		argv[1] = ".";
		simflg++;
		revisa_dir(argv[1]);	
		exit(0);
	}	
	if (argc > 2)
		argcflg++;
	if (--argc > 0 && *argv[1] == '-') {
		argv++;
		while (*++*argv) switch (**argv) {

		case 'a':
			aflg++;
			continue;
		case 'l':
			lflg++;
			continue;
		case 't':
			tflg++;
			continue;
		case 'F':
			fflg++;
			continue;
		default:
			continue;
		}
	argc--;
	}
	if (fflg) {
		aflg++;
		lflg = 0;
		tflg = 0;
		if(argcflg){
			revisa_dir(argv[1]);
		}
		else{
			revisa_dir(".");
		}
	}
	if (aflg) {
		if(argcflg){
			revisa_dir(argv[1]);
		}
		else{
			revisa_dir(".");
		}
	}

	if(lflg) {
		if(argcflg){
			lista_largo(argv[1]);
		}
		else{
			lista_largo(".");
		}
	
	}

  	fprintf(stderr,"Error, uso del comando %s \n",argv[0]);


}

main(argc, argv)
  int   argc; 
  char *argv[]; 
{
	procesa_util(argc, argv);
}



[Hilos de Discusión] [Fecha] [Tema] [Autor]