@Polymath: Das ist aber nicht das, was ich wollte.
Ich weiß bei meiner Matrix noch nicht wie lang meine andere Dimension wird.
@Polymath: Das ist aber nicht das, was ich wollte.
Ich weiß bei meiner Matrix noch nicht wie lang meine andere Dimension wird.
Ich würde vorschlagen, du definierst dir das Problem einfach weg ;). Also einfach die erste Klammer als Spalten und die zweite als Zeilen ansehen. Oder aus welchem Grund geht das nicht?
Naja, ich weiß ja, dass die Eingabe maximal PATH_MAX lang sein kann. Deshalb kann es auch nie mehr als PATH_MAX Tokens existieren.
Ich habe mir halt dann gedacht, dass ich mir gleich ein statisches Array dieser Größe anlegen kann und mir einfach den ganzen Code fürs realloc() des Array sparen kann.
Jedoch bekomme ich es irgendwie nicht hin. Entweder wird was falsches initialisiert oder der Compiler meckter immer (wegen -Werror, was aber dabei sein sollte)
Das funktioniert in C nicht. Ein Array ist nur ein Speicherblock einer gewissen Länge - diese muss aber bekannt sein.
Falls du ein Array von char-Pointern verwenden willst, siehe unten. Das ist aber ein Unterschied! Schau dir nochmal genau an, was ein String in C eigentlich ist.
Es können sogar nur weniger als [m]PATH_MAX[/m] Token existieren, überleg dir mal genau wie viele es maximal sein können.
[m]strtok(3)[/m] liefert dir einen Pointer in den übergebenen String zurück (und zerhackt dabei den String indem es [m]‚\0‘[/m]en einfügt). Der String an sich ist irgendwo anders gespeichert. Das einzige, was du jetzt tun musst, ist, diese Pointer in einem Array zu speichern. Das kannst du dann übergeben:
char *args[laenge];
/* ... */
args[i] = strtok(...);
Falls du Probleme mit C hast, ist ein Beispiel plus Compiler-Fehlermeldung nötig, damit wir dir sagen können wo das Problem liegt.
Das stimmt leider so nicht, da hab ich nicht genau genug nachgelesen. Eigentlich ist [m]pathconf(x, _PC_PATH_MAX);[/m] nicht korrekt, da es nur für relative Pfade gilt (genau wie [m]PATH_MAX[/m]). Beide geben an wie lang ein relativer Pfad vom aktuellen Verzeichnis aus sein darf (z.B. für [m]open()[/m] oder [m]chdir()[/m]):
{1}: fpathconf
Das sagt aber nichts über absolute Pfade aus.
Der SUSv4-Standard legt fest, dass [m]getcwd()[/m] auch längere Pfade zurückgeben können muss:
{2}: General Information
Interessanterweise scheint das unter GNU/Linux mit der Glibc nicht zu funktionieren, da ist nach einer absoluten Pfadlänge von [m]PATH_MAX[/m] Schluss - auch wenn der Buffer länger ist.
Also ist das manuelle Vergrößern mit [m]malloc()[/m]/[m]realloc()[/m]/[m]free()[/m] nötig. Entschuldigung für die falsche Information.
Duerfen wir die insertElement veraendern? Weil wenn ich compilen will mosert er bei mir.
int retVal = strlen(lauf->cmdLine);
plist.c: In function ‘removeElement’:
plist.c:77:23: error: conversion to ‘int’ from ‘size_t’ may alter its value [-Werror=conversion]
Wie wärs wenn du aus deinem int retVal ein size_t retVal machst?
Eigentlich nicht. Auf welchem Rechner übersetzt du das? Welche gcc-Version verwendest du?
Ein Tutor hat mir geraten mit -Wconversion zu compilieren, um „Hack-sicher“ zu programmieren.
Seither kommt die Meldung.
Wie wärs wenn du aus deinem int retVal ein size_t retVal machst?
Hab ich auch gemacht aber wir duerfen die methode in plist.c eigentlich nicht veraendern.
Ein Tutor hat mir geraten mit -Wconversion zu compilieren, um „Hack-sicher“ zu programmieren.
Seither kommt die Meldung.
Um „Hack-sicher“ zu programmieren brauchts etwas mehr als -Wconversion, aber zumindest wirst du schonmal auf Probleme hingewiesen, jedoch sollte man den Sinn dahinter schon verstehen, nämlich, dass strlen ein size_t zurückgibt und das ist meist etwas anderes als ein signed int.
Solange du kein gets(3) verwendest…
ich habe in der plist die walklist implementiert und auch eine callback funktion geschrieben die hoffentlich das macht was sie tun soll. wie rufe ich jetzt die walklist aus der clash heraus auf? die callback funktion muss doch in die clash oder? bekomme dann immer: error: âcallbackâ undeclared (first use in this function)
das ist die signatur meiner callback und mein aufruf ist: walklist(callback);
int callback(pid_t pid, const char *cmdLine)
prototyp vergessen?
Also: int callback(pid_t pid, const char *cmdLine); nach den includes am anfang der Datei.
um es kurz zu machen: ja vielen dank für die schnelle hilfe!
soll die clash wenn ich z.b. echo bla eintippe und dann statt enter strg+d drücke den befehl echo bla noch ausführen? macht eigentlich keinen sinn oder? aber die testshell führt ihn noch aus…
Find schon dass es so sinnvoll ist. stdin ist ein filestream in den du “echo bla” reingeschrieben hast und mit strg+d EOF gesendet.
Dann kommt fgets und liest n bytes bis zeilen oder dateiende und kriegt “echo bla” und das wird halt dann abgearbeitet.
nächste frage wenn man in der beispielclash “echo SOVIELBLOEDSINNIGERTEXTBISNICHTMEHRGEHT” eingibt kommt ein echo bis zu einer bestimmten stelle und dann die fehlermeldung “file name too long”. Anschließend versucht er das letzte zeichen des eingabetextes als command auszuführen und es kommt in meinem fall:
"/proj/i4sp1/pub/aufgabe4: z: No such file or directory
Exitstatus [z] = 1 "
das ist aber nicht sinnvoll oder?
Naja, wenn die Zeile ignoriert wird, solltest du auch tatsächlich alle Zeichen dieser Zeile ignorieren…
Wenn execvp zurückkehrt (also ein fehler aufrund unbekannten kommandonamens) dann habe ich ein exit(1) eingebaut. Somit wird mir dann beim Ausführen der Exitstatus 256 geliefert und nicht wie in der Beispielimplementierung 1. was für ein exit muss ich denn nehmen damit da 1 rauskommt ?!?
und noch eine Frage, wenn ich die Beispielimplementierung mit valgrind aufruf erhalte ich immer:
valgrind: failed to start tool ‘memcheck’ for platform ‘amd64-linux’: No such file or directory
was mach ich denn dabei falsch?
Klingt so als würde valgrind gerne in einer anderen Architektur arbeiten wollen als deine Clash oder seine Binaries. Hast du dein Programm auf dem Rechner gebaut, auf dem du valgrind startest? Probier einfach mal alle *.o und deine clash zu löschen und neu zu kompilieren.
Wenn das nicht hilft: mit welchen Parametern startest du valgrind?
Wenn execvp zurückkehrt (also ein fehler aufrund unbekannten kommandonamens) dann habe ich ein exit(1) eingebaut. Somit wird mir dann beim Ausführen der Exitstatus 256 geliefert und nicht wie in der Beispielimplementierung 1. was für ein exit muss ich denn nehmen damit da 1 rauskommt ?!?
Der [m]int[/m], den du mit [m]waitpid()[/m] bekommst, enthält nicht nur den Exit-Status, sondern weitere Informationen, die bitweise reincodiert sind. Den Exit-Status und andere Informationen bekommst du daraus mit den Makros, die in der Man-Page beschrieben sind, z. B. [m]WEXITSTATUS()[/m].