C++ трабла с mkdir через system()

Discussion in 'Linux, Freebsd, *nix' started by r3l0c, 28 Oct 2011.

  1. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    В общем еси исполнить в командной оболочке ,так сказать,
    Code:
    mkdir -p /usr/local/{dir,dir2,dir3}
    то создастся 3 нам нужных каталога в /usr/local/
    НО если я в коде выполняю тоже самое
    Code:
    system("mkdir -p /usr/local/{dir,dir2,dir3}");
    , то в /usr/local/ создаестся каталог с именем {dir,dir2,dir3}
    Вот как мне быть?))
    3 раза выполнить mkdir не предлогать--- все, что выше--пример, на самом деле директорий может быть намного больше ;)
    Не говорить, что есть системный вызов mkdir(char *dirname, int mode); тк на сколько я знаю там нельзя использовать махинации типо {dir,dir2,dir3}

    PS/Если не туда запостил---прошу прощения
     
    #1 r3l0c, 28 Oct 2011
    Last edited: 28 Oct 2011
  2. sailor_truse

    sailor_truse Banned

    Joined:
    27 Sep 2011
    Messages:
    33
    Likes Received:
    1
    Reputations:
    0
    Ну и что что нет там таких махинаций, я конечн не оч разбираюсь в кодинге под линукс, но имхо быстрее в цикле вызвать системную функцию
     
  3. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    О, да, с таким же успехом я могу вызвать выполнить в цикле system("mkdir ..."), дело не в этом)), просто у мня сча есть оч громадная функция, но если я замучу так, как описано в моем посте -----
    1-функция уменьшится в 4 раза
    2-функция будет максимально надежной, т.е процент "недоделанья" будет =0, ну и просто оттимизация).

    Еще подсказка---
    допустим
    char *cmd;
    используется в system(cmd);
    но в cmd за нуль-байтом есть еще всяка куйня, тк исползовал malloc и там брал с запасом на 1,2 больше--segmentation fault, вот может ли это повлиять?
     
  4. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Кстате быстрее будет вызвать system() 1 раз c финтибоберными скобкам в конце :D
     
    #4 r3l0c, 29 Oct 2011
    Last edited: 29 Oct 2011
  5. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Не может---проверил.
     
  6. sailor_truse

    sailor_truse Banned

    Joined:
    27 Sep 2011
    Messages:
    33
    Likes Received:
    1
    Reputations:
    0
    Я не уверен но этот мкдир через систем разве не будет дергать системный mkdir в цикле?

    Повторюсь что в кодинге под люнь не разбираюсь:3
     
  7. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Мне не надо в цикле вызывать system(), мне надо один раз, но чтобы конкресно, и потом проверить результат вызовом int opendir(), , короче говоря еси бы мне было пох---я бы замутил как ты предлагал еще сразу, номне так не надо. Еще объясню, почему мне надо так сделать--- если выполнять как ты предлогаешь--- syystem("mkdir -p /usr/блабла/бла/бла/бла"); потом надо проверить результат, и потом еще насоздавать целый паровоз директорий в конечной, и в них, и все это проверять? xD, я не настолько наркоман, чтобы делать такой безобразный код), но опять же мона все замутить в двумерный массив, и прогнать в цикле, но там тоже докуя формальностей), вот почему мне надо один раз вызвать system(); а потом просто проверить одну из конецных папок, имхо результат выполнения system() не всегда !=0 при успешном выполнении, и по нему определить создались ли все директории невозможно. а если выполнять в цикле, то и проверять надо в цикле----докуя делов короче...
     
  8. sailor_truse

    sailor_truse Banned

    Joined:
    27 Sep 2011
    Messages:
    33
    Likes Received:
    1
    Reputations:
    0
    Я не про вызов систем а про вызов системной процедуры.
    В подробности того, что ты написал дальше было лень вдаваться, сорри:3
     
  9. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Ы), ты мня не понел--- если мы будем использовать системный вызов на создание директории, то там нельзя поставить ключь
    Code:
    -p
    , но мона проверить возвращенное значение mkdir() , но мне это не надо)).

    Мне просто надо создать паровоз папок в нужной мне директории xD
     
  10. sailor_truse

    sailor_truse Banned

    Joined:
    27 Sep 2011
    Messages:
    33
    Likes Received:
    1
    Reputations:
    0
    Странно, что сюда еще не отписал ни один грамотный Си кодер>_<
     
  11. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Перевелись линупс кодеры видимо :D
     
  12. Failure

    Failure Elder - Старейшина

    Joined:
    21 Sep 2008
    Messages:
    179
    Likes Received:
    46
    Reputations:
    16
    1) system -> sh -> execve("/bin/mkdir",...) -> mkdir (syscall)
    2) mkdir (syscall)

    как быстрее?
    Если не понял:
    Code:
    # strace mkdir -p /tmp/x/{mydir1,mydir2,mydir2} 2>&1 | grep 'mkdir'
    execve("/bin/mkdir", ["mkdir", "/tmp/x/mydir1", "/tmp/x/mydir2", "/tmp/x/mydir2"], [/* 32 vars */]) = 0
    mkdir("/tmp/x/mydir1", 0777)            = 0
    mkdir("/tmp/x/mydir2", 0777)            = 0
    mkdir("/tmp/x/mydir2", 0777)            = -1 EEXIST (File exists)
    
    Не знаю что ты там шкодишь, но мне кажется тебе бы хватило баш скрипта

    Да и ко всему:
    Code:
    null:/var/tmp# ./main 
    total 12
    drwxr-xr-x 2 root root 4096 2011-10-29 23:11 dir1
    drwxr-xr-x 2 root root 4096 2011-10-29 23:11 dir2
    drwxr-xr-x 2 root root 4096 2011-10-29 23:11 dir3
    null:/var/tmp# cat main.c 
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc,char** argv,char **envp) {
    	system("mkdir -p /tmp/x/{dir1,dir2,dir3} && ls -l /tmp/x");
    	return 0;
    }
     
  13. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Про быстрее согласен, отписался лиж бы тот типок отстал :D
    шкодил я год назад на делфях :D , сча деньги зарабатываю))
    Code:
    int domain_add(char *user, char *domain) 
    {	
    char *tmp; 	
    FILE *conf;
      	tmp=my_strcat("mkdir -p /var/www/",user);
     	tmp=my_strcat(tmp,"/"); 	
                    tmp=my_strcat(tmp,domain);
     	system(tmp);
     	tmp=my_strcat(tmp,"/");
     	system(my_strcat(tmp,"log"));
     	system(my_strcat(tmp,"htdocs -m 0700"));
     	system(my_strcat(tmp,"cgi-bin -m 0700"));
     	system(my_strcat(my_strcat("chown www-data.www-data ", s_copy(tmp,pos(tmp,"/"),strlen(tmp))),"htdocs"));
     	system(my_strcat(my_strcat("chown www-data.www-data ", s_copy(tmp,pos(tmp,"/"),strlen(tmp))),"cgi-bin"));
     	if ((if_dir(tmp)))  	
                    {
     	     if (0!=(conf = fopen(F_VH_CONFIG,"a"))){ 		
    	fprintf(conf,VH_TPL, domain, domain, domain, user, domain, user, domain, user, domain); 			
                     fprintf(conf,"%s",RH);
                     fclose(conf); 		
    	return OK;
    } else return E_DOMAIN_ADD_TO_VHOSTS; 
    }
     }
     
    #13 r3l0c, 30 Oct 2011
    Last edited: 30 Oct 2011
  14. Failure

    Failure Elder - Старейшина

    Joined:
    21 Sep 2008
    Messages:
    179
    Likes Received:
    46
    Reputations:
    16
    зарабатывай конечно, как запустишь обязательно дай ссылку, создам юзера с ником
    Code:
    ;halt #
    используй системные вызовы, или хотя бы в форке обращайся напрямую к /bin/mkdir
     
  15. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    первое--сэнкс :D, но там еще будет глобальная оптимизация итп%)), пока мне надо рабочий вариант)
     
  16. yesday

    yesday New Member

    Joined:
    30 Oct 2011
    Messages:
    8
    Likes Received:
    2
    Reputations:
    0
    ТС, позаоль поинтересоваться - а зачем тут Си? Как правильно выше заметили - обычного Баша - с головой хватит. Если есть цель "не сдать сорцы врагам" - напиши свой криптер, либо заюзай уже существующие. Опять же, можно скрипт обфусцировать сначала, а потом закриптовать... Вариантов масса.
     
  17. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Ы, скорость работы скрипта на баше и с++, а если бы я на сях не хотел закодить, я бы на перле кодил---там мона к мускулу коннектица итп итд, еси нужные либы инсталировать=).
    2- потоки
     
  18. yesday

    yesday New Member

    Joined:
    30 Oct 2011
    Messages:
    8
    Likes Received:
    2
    Reputations:
    0
    :facepalm:
    Тебе ж выше Файлуре продемонстрировал... Ты, считай, транслируешь баш скрипт в код С через вызов system().
    К мускулу и из С можно конектица, есличо %)
     
    1 person likes this.
  19. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Ы, чел, про мускул я в курсе.
    Если бы мне надо было написать на баше--я бы написал, мне надо на сях, по некоторым причинам---я пишу на сях.
    Про "транслируешь код"
    ----у мня уже половина программулины на сисколы переделано.
    PS: троллолодетектед. xD, тема исчерпана.
     
  20. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    просто данные вопросы лучше задавать в разделе кодинг - там ответят быстрее.