Markus Pitha: (C) Im "system" Befehl Variable verwenden.

Hallo,
ich habe eine Variable, worin der Pfad vom HOME Verzeichnis des aktuellen Users steht. Jetzt würde ich gerne ein Verzeichnis .ff in diesem HOME Verzeichnis erstellen. Wenn ich aber system("mkdir homedir/.ff"); schreibe, will er mir natürlich ein Verzeichnis im Directory "homedir" anlegen, welches natürlich nicht exisitert. Wie kann ich also in C den Inhalt einer Variable in einem Systembefehl verwenden?

Markus.

--
sh:( fo:| ch:? rl:( br:> n4:( ie:{ mo:) va:) de:] zu:) fl:( ss:| ls:] js:|
  1. Hello Markus,

    ich habe eine Variable, worin der Pfad vom HOME Verzeichnis des aktuellen Users steht. Jetzt würde ich gerne ein Verzeichnis .ff in diesem HOME Verzeichnis erstellen. Wenn ich aber system("mkdir homedir/.ff"); schreibe, will er mir natürlich ein Verzeichnis im Directory "homedir" anlegen, welches natürlich nicht exisitert. Wie kann ich also in C den Inhalt einer Variable in einem Systembefehl verwenden?

    Was Du so im Groben vorhast, habe ich wohl verstanden.

    Allerdings habe ich nicht verstanden, welcher Pfad wo gespeichert ist, wo das Script abgespeichert ist, welchen Pfad Du anlegen willst und wieso Du nicht die PHP-Funktion mkdir() benutzt?

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hi Tom!
       so im Groben vorhast, habe ich wohl verstanden.

      Allerdings habe ich nicht verstanden, welcher Pfad wo gespeichert ist, wo das Script abgespeichert ist, welchen Pfad Du anlegen willst und wieso Du nicht die PHP-Funktion mkdir() benutzt?

      Weil es in C vielleicht nicht die PHP-Funktion mkdir() gibt ;-) [1]

      Grüße,
      Fabian St.

      [1] Ich weiß, dass viele PHP-eigene Funktionen in C geschrieben sind. Demnach müsste er sich eben den C-Sourcecode der PHP-Funktion mkdir() besorgen...

      --
      Endlich online: http://fabis-site.net
      --> XHTML, CSS, PHP-Formmailer, Linux
      Selfcode: ie:% fl:|  br:^ va:) ls:& fo:) rl:( n4:° ss:| de:> js:| ch:| mo:) zu:)
      1. Hello,

        Weil es in C vielleicht nicht die PHP-Funktion mkdir() gibt ;-) [1]

        Ach, wie blind. Ich habe die Kategorie irgendwie übersehen. Sorry.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
      2. Hi,

        so im Groben vorhast, habe ich wohl verstanden.

        Allerdings habe ich nicht verstanden, welcher Pfad wo gespeichert ist, wo das Script abgespeichert ist, welchen Pfad Du anlegen willst und wieso Du nicht die PHP-Funktion mkdir() benutzt?

        Weil es in C vielleicht nicht die PHP-Funktion mkdir() gibt ;-) [1]

        Aber dafür in POSIX ;-)

        ich weiß ja nicht, welches System Du nutzt, aber ein Versuch wäre es wert, nach mkdir() zu suchen.

        'man 2 mkdir' sagt hier (Linux. LibC Version 2.2.5):

        #include <sys/stat.h>
        #include <sys/types.h>

        int mkdir(const char *pathname, mode_t mode)

        mkdir attempts to create a directory named pathname.

        mode  specifies  the permissions to use. It is modified by
         the process's umask in the usual way: the  permissions  of
         the created file are (mode & ~umask).

        [...]
        RETURN VALUE
        mkdir  returns zero on success, or -1 if an error occurred
        (in which case, errno is set appropriately).

        usw.
        Beispiel:

        #include <stdio.h>     /* fprintf() */
        #include <stdlib.h>    /* exit() */
        #include <limits.h>    /* PATH_MAX */
        #include <sys/stat.h>  /* für mkdir()  */
        #include <sys/types.h> /* ditto */
        #include <string.h>    /* strerror(), strlen() */
        #include <errno.h>     /* errno */

        #ifndef PATH_MAX
        #define PATH_MAX 250
        #endif

        int main(int argc, char **argv){
          if(argc < 2){
            fprintf(stderr,"Usage: %1.256s directorynames\n", argv[0]);
            exit(EXIT_FAILURE);
          }
          argc--;
          while(argc--){
            /* Größer PATH_MAX ist jetzt nicht unbedingt
               eine wirksame Sicherung ;-) */
            if(strlen(argv[argc +1]) > PATH_MAX || mkdir(argv[argc +1],0) != 0){
              fprintf(stderr,"mkdir() failed, reason: %1.256s\n",strerror(errno));
              exit(EXIT_FAILURE);
            }
            printf("Verzeichnis %1.256s erfolgreich errichtet\n",argv[argc +1]);
          }
          exit(EXIT_SUCCESS);
        }

        so short

        Christoph Zurnieden

  2. Hallo,

    Du musst eine "Hilfsvariable" anlegen dir den Befehl für system speichern soll:
    Mit sprintf kannst du dann reinschreibn was du willst...

    char *tmp;
    sprintf(tmp,"mkdir %s/.ff",homedir);
    system(tmp);

    MfG STefan

    Hallo,
    ich habe eine Variable, worin der Pfad vom HOME Verzeichnis des aktuellen Users steht. Jetzt würde ich gerne ein Verzeichnis .ff in diesem HOME Verzeichnis erstellen. Wenn ich aber system("mkdir homedir/.ff"); schreibe, will er mir natürlich ein Verzeichnis im Directory "homedir" anlegen, welches natürlich nicht exisitert. Wie kann ich also in C den Inhalt einer Variable in einem Systembefehl verwenden?

    Markus.

    1. Hallo,

      char *tmp;
      sprintf(tmp,"mkdir %s/.ff",homedir);
      system(tmp);

      Danke für deine Hilfe. Allerdings funktionierte es bei mir erst dann, wenn ich statt char *tmp zB char tmp[50] schreibe. Warum wurde *tmp als Zeiger auf char deklariert?

      --
      sh:( fo:| ch:? rl:( br:> n4:( ie:{ mo:) va:) de:] zu:) fl:( ss:| ls:] js:|
      1. Nachtrag:
        Falls ich es nicht als char Array deklariert hätte, bekäme ich einen "Segmentation fault" Error.

        Markus.

        --
        sh:( fo:| ch:? rl:( br:> n4:( ie:{ mo:) va:) de:] zu:) fl:( ss:| ls:] js:|
        1. Hi,

          Nachtrag:
          Falls ich es nicht als char Array deklariert hätte, bekäme ich einen "Segmentation fault" Error.

          Was ja auch logisch ist, da der Zeiger nicht initialisiert ist, und auf einen zufälligen (naja, nicht wirklich zufälligen, aber ... ) nicht zugeordneten Speicher zeigt. Du musst entweder den Speicher so wie du es gemacht direkt reservieren, oder dies mit malloc machen.
          In etwa so:
          char *tmp = (char*)malloc(sizeof(char)*50);
          Wobei du dann den mit malloc angeforderten Speicher später wieder freigeben musst.

          Grüße Andres

      2. Hi,

        Danke für deine Hilfe. Allerdings funktionierte es bei mir erst dann, wenn ich statt char *tmp zB char tmp[50] schreibe. Warum wurde *tmp als Zeiger auf char deklariert?

        sprintf() erwartet einen Zeiger auf char. Durch die bloße Deklaration als solcher wurde allerdings noch kein Speicherplatz allokiert, daher wohl die Fehlermeldung. Deine Deklaration "char tmp[50]" allokiert sofort 50 Bytes. Wird der Bezeichner eines Arrays ohne eckige Klammern angegeben (in deinem Fall "tmp"), entspricht dies in C dem Zeiger auf das erste Element. Du übergibst also korrekt "Zeiger auf char".

        Gruß,
        Andreas.

        1. Danke euch allen.
          So etwas ähnliches habe ich mir schon gedacht. Durch deine Bestätigung ist es mir jetzt klar.

          Markus.

          --
          sh:( fo:| ch:? rl:( br:> n4:( ie:{ mo:) va:) de:] zu:) fl:( ss:| ls:] js:|