myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

Eigenes UNIX-Kommando ls(1)

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 21.06.10, 14:02   #1
wa53kefa
Newbie
 
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
wa53kefa ist noch neu hier! | 0 Respekt Punkte
Standard Eigenes UNIX-Kommando ls(1)

Hallo,

ich möchte ein Programm entwickeln, welches ähnlich wie beim UNIX-Kommando ls(1) mir den Inhalt des aktuellen Verzeichnisses ('.') anzeigen kann.

Zunächst soll es Größe /* ermittelt durch stat(2)*/
und Namen /* durch Tabulator getrennt '\t' */
aller im aktuellen Verzeichnis vorhandenen Einträge /* opendir(3), readdir(3), closedir(3) */
in einer Zeile pro Eintrag ausgeben.
Am Ende der Ausgabe soll das Programm die Gesamtzahl der ausgegebenen Einträge ausgeben.

Desweiteren sollte das Programm versteckte Dateien /*deren name mit einem '.' beginnt*/ nicht anzeigen und nicht reguläre Dateien ignorieren.

Könnt ihr mir bei meinem Start behilflich sein?
Ich möcht später das Programm um viele weitere Funktionen erweitern um in C und UNIX mehr Erfahrungen zu sammeln.

Viele Grüße
wa53kefa
wa53kefa ist offline   Mit Zitat antworten
Ungelesen 21.06.10, 14:33   #2
gosha16
Banned
 
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
gosha16 ist noch neu hier! | 0 Respekt Punkte
Standard

mit:
PHP-Code:
int main(int argccharargv[])
{

kannste ja mal anfangen.


Wo haperts denn?
gosha16 ist offline   Mit Zitat antworten
Ungelesen 21.06.10, 15:13   #3
wa53kefa
Newbie
 
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
wa53kefa ist noch neu hier! | 0 Respekt Punkte
Standard

das ist jetzt mein erstes C programm auf UNIX.
Bisher habe ich auf Java Programmiert, und meine ersten C Programme waren für ein ATmega32.
Probleme habe ich vorallem mit den Fehlern. Was soll ich machen wenn ich überhaupt kein Speicher habe? Muss ich selber um Ressourcen fragen /*malloc(2)*/ oder macht das Programm unter UNIX das selber?

noch ne frage: Ich Programmiere ja C und ist da die main-methode nicht
int main (void){
}
? rückgabetyp ist verständlich wegen Fehlern z.B.. Aber wieso sollte ich der main funktion parameter übergeben?

Wie "durchstöbere" ich mein Verzeichnis? also wie soll ich denn die einzelnen Dateien nach und nach durchforsten?

Wenn ich mir beispielsweise die manualpage von closedir anschaue erkenne ich, was ich einbinden muss:
#include<sys/types.h>
#include<dirent.h>
rückgabewert 0 für success, -1 bei fehler und errno wird gesetzt. Wie sieht errno denn aus? Wird errno auch gleich mit ausgegeben?

Wie du siehst scheitere ich an Grundlagen, aber auch mir der man komme ich nicht richtig klar.
Deswegen dachte ich mir, wenn ich vll so ein kleines Programm "geschrieben bekomme", könnte ich sehen, wie ich die sache rangehen muss und könnte das Programm selbstständig erweitern.
wa53kefa ist offline   Mit Zitat antworten
Ungelesen 21.06.10, 15:28   #4
haze303
xor eax, eax
 
Benutzerbild von haze303
 
Registriert seit: Sep 2009
Beiträge: 596
Bedankt: 466
haze303 ist noch neu hier! | 1 Respekt Punkte
Standard

Schau dir mal folgenden Auszug aus der GNU C Library an - dieser sollte dir sehr viel weiterhelfen.
Generell kann ich die GNU C Library als Nachschlagewerk nur empfehlen.

[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]

Viele Grüße,
haze303


//Edit:

Folgendes finde ich schöner.

Code:
int main(void) {

...

return 0;
}
__________________
Desktop: Arch Linux | Laptop: Arch Linux
VM: Windows 7, Windows XP, Fedora 14, Arch, Windows Server 2008 R2 Enterprise
haze303 ist offline   Mit Zitat antworten
Ungelesen 21.06.10, 16:27   #5
gosha16
Banned
 
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
gosha16 ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von wa53kefa Beitrag anzeigen
Probleme habe ich vorallem mit den Fehlern. Was soll ich machen wenn ich überhaupt kein Speicher habe? Muss ich selber um Ressourcen fragen /*malloc(2)*/ oder macht das Programm unter UNIX das selber?
Speicher forderst du entweder dynamisch an
PHP-Code:
{
 
charheap;
 
/*128 Byte anfordern */
 
heap malloc(128 sizeof(char));
 if(
heap == NULL)
   return -
1;

oder definierst ihn schon beim programmieren:
PHP-Code:
{
int count;
/* arbeite damit*/
for(count=0;count <= 9count++);

Unterschied zwischen Stack und Heap kennst du nehme ich jetzt mal an?




Zitat:
Zitat von wa53kefa Beitrag anzeigen
noch ne frage: Ich Programmiere ja C und ist da die main-methode nicht
int main (void){
}
?
Du _kannst_ dein main() so definieren, dann kannst du deinem Programm aber später keine Parameter mitgeben oder auf Environment Variablen zugreifen (zumindest nicht über den main parameter).
So wie ich es definiert hab gibt dir main() mit argc die Anzahl der übergebenen Parameter und mit argv[] die Parameter selbst.

Zitat:
Zitat von wa53kefa Beitrag anzeigen
Wie "durchstöbere" ich mein Verzeichnis? also wie soll ich denn die einzelnen Dateien nach und nach durchforsten?
du solltest dir mal anschauen was die funktionen die du genannt hast so zurückgeben.


Zitat:
Zitat von wa53kefa Beitrag anzeigen
Wenn ich mir beispielsweise die manualpage von closedir anschaue erkenne ich, was ich einbinden muss:
#include<sys/types.h>
#include<dirent.h>
rückgabewert 0 für success, -1 bei fehler und errno wird gesetzt. Wie sieht errno denn aus? Wird errno auch gleich mit ausgegeben?
errno wird nicht mit ausgegeben, benutze dazu die Funktion perror()

Zitat:
Zitat von wa53kefa Beitrag anzeigen
Deswegen dachte ich mir, wenn ich vll so ein kleines Programm "geschrieben bekomme", könnte ich sehen, wie ich die sache rangehen muss und könnte das Programm selbstständig erweitern.
Versuch's erstmal selber und wie gesagt schau darauf was die Funktionen die du verwendest für Parameter erwarten wozu die gut sind und was zurückgegeben wird.
gosha16 ist offline   Mit Zitat antworten
Ungelesen 21.06.10, 22:18   #6
wa53kefa
Newbie
 
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
wa53kefa ist noch neu hier! | 0 Respekt Punkte
Standard

hallo jungs,

erstmal dankeschön für die sehr schnellen antworten,
ich werde mir des mal in den nächsten tagen mal anschauen und versuchen zu programmieren.
Unterschied zwischen Stack und Heap? Heap ist doch Bausstruktur und Stack ist doch stapeln (also last in first out | first in last out ?).
Eine Frage habe ich noch,
Ich Programmiere mit Notepad++ und woher weiß ich dann, dass das Programm funktioniert? Also wie oder wo muss ich dann die C-Datei laufen lassen?
Ist ja nicht so wie bei Eclipse/Java wo ich ein ausgabefenster habe. Oder muss ich dafür die "originale" ls.c mit meiner ersetzen?
ich kenne die befehle perror oder printf() aber wo werden diese angezeigt? Oder benötige ich wie bei Java ein Programm (Eclipse) zum Programmieren?

Nochmals Danke an euch.
viele Grüße
wa53kefa ist offline   Mit Zitat antworten
Ungelesen 22.06.10, 08:05   #7
kramido
Erfahrener Newbie
 
Registriert seit: Apr 2010
Beiträge: 172
Bedankt: 31
kramido ist noch neu hier! | 0 Respekt Punkte
Standard

@wa53kefa: Du solltest dir ein bisschen über die Basics und über den Modalitäten klarwerden, die zwischen der Erstellung von Programmcode und der Bibliothek oder dem ausführbaren Programm liegen.

Grundlegende Informationen: [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]

Der Vorgang des Programmierens hat nichts mit der Übersetzung eines Programms zu tun. Hierfür benötigst du natürlich Software. Diese kann für ein *nix-Programm i.d.R. mit der [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ] übersetzt werden. Diese ist quelloffen und Freeware.

Es gibt für Linux unter anderem auch einige freie Entwicklungsumgebungen. Ich möchte dir da keine Empfehlung aussprechen, aber ich habe schon gute Erfahrungen mit Eclipse [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ] gemacht. Das Verwenden einer IDE erleichtert für Einsteiger den Umgang durch Try&Error doch ungemein.

Ausgabe von printf() erfolgt auf die Standardausgabe, sprich auf die Konsole, sofern du das Programm von dort aus startest.

Stack vs. Heap:
Stack: Speicher mit beschränkter Größe im Bereich von kB, der nach dem [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]-Prinzip funktioniert. Verwaltung dieses Speichers in C/C++ geschiet automatisch.
Heap: Zugriff auf den Hauptspeicher des PCs, Anfrage beim OS zur Reservierung von Speicherbereichen. Müssen von Hand verwaltet (angefordert und freigegeben) werden.

Der Heap ist nichts, womit sich ein Programmieranfänger in seinen ersten Gehversuchen rumschlagen sollte. Da kann man viel Schaden anrichten!

Seit wann gibt es Notepad++ auch für *nix?
kramido ist offline   Mit Zitat antworten
Ungelesen 28.06.10, 14:58   #8
wa53kefa
Newbie
 
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
wa53kefa ist noch neu hier! | 0 Respekt Punkte
Standard

hallo,

hat einer von euch mal kurz lust sich das Programm durchzulesen und mir eventuell ein paar Tipps und Verbesserungvorschläge zu geben?

gruß
wa53kefa ist offline   Mit Zitat antworten
Ungelesen 28.06.10, 15:19   #9
haze303
xor eax, eax
 
Benutzerbild von haze303
 
Registriert seit: Sep 2009
Beiträge: 596
Bedankt: 466
haze303 ist noch neu hier! | 1 Respekt Punkte
Standard

Gerne - poste einfach den Quelltext hier in das [CODE]-Tag.

Viele Grüße,
haze303
__________________
Desktop: Arch Linux | Laptop: Arch Linux
VM: Windows 7, Windows XP, Fedora 14, Arch, Windows Server 2008 R2 Enterprise
haze303 ist offline   Mit Zitat antworten
Ungelesen 30.06.10, 17:08   #10
wa53kefa
Newbie
 
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
wa53kefa ist noch neu hier! | 0 Respekt Punkte
Standard

So,

hier ist der Code.
Falls einem ein Fehler auffällt, oder anregungen hat, wie ich mein Programm verbessern kann, dann bin ich für die Anregungen sehr dankbar.


Gruß
wa53kefa

Code:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
	 
int main (void){
	DIR *dp;
	struct dirent *ep;
	struct stat buf;
	long unsigned int total = 0;


	dp = opendir (".");
	if (dp == NULL) {
		perror ("opendir");
		exit(-1);
	}

		
	if (dp != NULL){
		while (errno=0, (ep = readdir (dp))!=NULL){
			if(ep->d_name[0]!='.'){
				stat(ep->d_name, &buf);
				if (! S_ISREG(buf.st_mode)){
					fprintf(stderr, "Not a regular File!\n");
				}else{

					printf("%lu\t%s\n", buf.st_size, ep->d_name);
					total ++;
						
				}			
			}
		}
	printf("Total: %lu\n",total);
	}
	closedir (dp); /*Keine Fehlerueberpruefung, da der einzige Fehler der Uebergabeparameter seien kann, den ich schon nech opendir() ueberpruefe.*/
	return 0;
}
wa53kefa ist offline   Mit Zitat antworten
Ungelesen 30.06.10, 18:20   #11
urga
Mitglied
 
Benutzerbild von urga
 
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
urga ist noch neu hier! | 0 Respekt Punkte
Standard

alles bestens.
__________________
entropie erfordert keine wartung
urga ist offline   Mit Zitat antworten
Ungelesen 30.06.10, 21:55   #12
kramido
Erfahrener Newbie
 
Registriert seit: Apr 2010
Beiträge: 172
Bedankt: 31
kramido ist noch neu hier! | 0 Respekt Punkte
Standard

Guter Stil in C(++): Initialisierung von Zeigern immer mit NULL um Fehlern vorzubeugen.

Code:
	
DIR *dp = NULL;
struct dirent *ep = NULL;
Wieso fragst du auf dp gleich NULL ab, brichst dann das Programm ab und fragst danach noch auf ungleich NULL ab? Ergibt keinen Sinn! Die zweite Bedingung ist immer erfüllt, sofern sie geprüft wird!

Code:
	if (dp == NULL) {
		perror ("opendir");
		exit(-1);
	}

		
	if (dp != NULL){
Außerdem könnte man als Stilhilfe noch angeben, dass man Konstanten stets auf die linke Seite des Vergleichs stellen sollte, damit keinen versehentliche Zuweisung geschieht. Sprich:
Code:
if(NULL != dp){
kramido ist offline   Mit Zitat antworten
Ungelesen 30.06.10, 23:21   #13
wa53kefa
Newbie
 
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
wa53kefa ist noch neu hier! | 0 Respekt Punkte
Standard

Hallo,

ich habe gerade bemerkt, dass ich das nicht gespeicherte Programm gepostet habe.
Es fehlte noch eine wichtige Fehlerabfrage die ich noch hinzugefügt habe.
Ob stat funktioniert hat oder wenn nicht, wieso es nicht funtioniert hat.

Hier mein verändertes Programm, wo ich eure Anregungen miteingebracht habe:
Code:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
	 
int main (void){
	DIR *dp = NULL;
	struct dirent *ep = NULL;
	struct stat buf;
	long unsigned int total = 0;
	int x = 0;


	dp = opendir (".");
	if (NULL == dp) {
		perror ("opendir");
		exit(-1);
	}

	while (errno=0, NULL != (ep = readdir (dp))){
		if(ep->d_name[0]!='.'){
			x = stat(ep->d_name, &buf);		/*prüfen ob stat fehlschlaegt*/
			if(-1 == x){
				fprintf(stderr, "Getting information from file %s failed with reason : %s\n",
				ep->d_name, strerror(errno));
			}else if(0 == x){			
				if (! S_ISREG(buf.st_mode)){
					/*fprintf(stderr, "Not a regular File!\n");*/
				}else{
					printf("%lu\t%s\n", buf.st_size, ep->d_name);
					total ++;
				}
			}			
		}
	}
	printf("Total: %lu\n",total);
	
	closedir (dp); /*Keine Fehlerueberpruefung, da der einzige Fehler der Uebergabeparameter seien kann, den ich aber von opendir() uebergeben bekomme.*/
	return 0;
}
wa53kefa ist offline   Mit Zitat antworten
Ungelesen 01.07.10, 20:14   #14
hugoegon42
Anfänger
 
Registriert seit: May 2009
Beiträge: 1
Bedankt: 0
hugoegon42 ist noch neu hier! | 0 Respekt Punkte
Standard OT, passt aber irgendwie ;-)

One day a Novice came to the Master.
"Master," he said, "How is it that I may become a Writer of Programs?".
The Master looked solemnly at the Novice.
"Have you in your possession a Compiler of Source Code?" the Master asked.
"No," replied the Novice. The Master sent the Novice on a quest to the Store of Software.


Many hours later the Novice returned.
"Master," he said, "How is it that I may become a Writer of Programs?".
The Master looked solemnly at the Novice.
"Have you in your possession a Compiler of Source Code?" the Master asked.
"Yes," replied the Novice.
The Master frowned at the Novice.
"You have a Compiler of Source. What now can prevent you from becoming a Writer of Programs?".
The Novice fidgeted nervously and presented his Compiler of Source to the Master.
"How is this used?" asked the Novice.
"Have you in your possession a Manual of Operation?" the Master asked.
"No," replied the Novice.
The Master instructed the Novice as to where he could find the Manual of Operation.


Many days later the Novice returned.
"Master," he said, "How is it that I may become a Writer of Programs?".
The Master looked solemnly at the Novice.
"Have you in your possession a Compiler of Source Code?" the Master asked.
"Yes," replied the Novice.
"Have you in your possession a Manual of Operation?" the Master asked.
"Yes," replied the Novice.
The Master frowned at the Novice.
"You have a Compiler of Source, and a Manual of Operation. What now can prevent you from becoming a Writer of Programs?".

At this the Novice fidgeted nervously and presented his Manual of Operations to the Master.
"How is this used?" asked the Novice.
The Master closed his eyes, and heaved a great sigh.
The Master sent the Novice on a quest to the School of Elementary.


Many years later the Novice returned.
"Master," he said, "How is it that I may become a Writer of Programs?".
The Master looked solemnly at the Novice.
"Have you in your possession a Compiler of Source Code, a Manual of Operation and an Education of Elementary?" the Master asked.
"Yes," replied the Novice.
The Master frowned at the Novice.
"What then can prevent you from becoming a Writer of Programs?".


The Novice fidgeted nervously. He looked around but could find nothing to present to the Master.
The Master smiled at the Novice.
"I see what problem plagues you." said the Master.
"Oh great master, please tell me." asked the Novice.

The Master turned the Novice toward the door, and with a supportive hand on his shoulder said, "Go young Novice, and Read The Fucking Manual." And so the Novice became enlightened.
hugoegon42 ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.


Sitemap

().