Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
21.06.10, 14:02
|
#1
|
Newbie
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
|
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
|
|
|
21.06.10, 14:33
|
#2
|
Banned
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
|
mit:
PHP-Code:
int main(int argc, char* argv[])
{
}
kannste ja mal anfangen.
Wo haperts denn?
|
|
|
21.06.10, 15:13
|
#3
|
Newbie
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
|
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.
|
|
|
21.06.10, 15:28
|
#4
|
xor eax, eax
Registriert seit: Sep 2009
Beiträge: 596
Bedankt: 466
|
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
|
|
|
21.06.10, 16:27
|
#5
|
Banned
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
|
Zitat:
Zitat von wa53kefa
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:
{
char* heap;
/*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 <= 9; count++);
}
Unterschied zwischen Stack und Heap kennst du nehme ich jetzt mal an?
Zitat:
Zitat von wa53kefa
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
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
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
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.
|
|
|
21.06.10, 22:18
|
#6
|
Newbie
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
|
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
|
|
|
22.06.10, 08:05
|
#7
|
Erfahrener Newbie
Registriert seit: Apr 2010
Beiträge: 172
Bedankt: 31
|
@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?
|
|
|
28.06.10, 14:58
|
#8
|
Newbie
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
|
hallo,
hat einer von euch mal kurz lust sich das Programm durchzulesen und mir eventuell ein paar Tipps und Verbesserungvorschläge zu geben?
gruß
|
|
|
28.06.10, 15:19
|
#9
|
xor eax, eax
Registriert seit: Sep 2009
Beiträge: 596
Bedankt: 466
|
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
|
|
|
30.06.10, 17:08
|
#10
|
Newbie
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
|
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;
}
|
|
|
30.06.10, 18:20
|
#11
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
alles bestens.
__________________
entropie erfordert keine wartung
|
|
|
30.06.10, 21:55
|
#12
|
Erfahrener Newbie
Registriert seit: Apr 2010
Beiträge: 172
Bedankt: 31
|
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:
|
|
|
30.06.10, 23:21
|
#13
|
Newbie
Registriert seit: Nov 2009
Beiträge: 66
Bedankt: 11
|
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;
}
|
|
|
01.07.10, 20:14
|
#14
|
Anfänger
Registriert seit: May 2009
Beiträge: 1
Bedankt: 0
|
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.
|
|
|
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
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
().
|