В общем еси исполнить в командной оболочке ,так сказать, 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/Если не туда запостил---прошу прощения
Ну и что что нет там таких махинаций, я конечн не оч разбираюсь в кодинге под линукс, но имхо быстрее в цикле вызвать системную функцию
О, да, с таким же успехом я могу вызвать выполнить в цикле system("mkdir ..."), дело не в этом)), просто у мня сча есть оч громадная функция, но если я замучу так, как описано в моем посте ----- 1-функция уменьшится в 4 раза 2-функция будет максимально надежной, т.е процент "недоделанья" будет =0, ну и просто оттимизация). Еще подсказка--- допустим char *cmd; используется в system(cmd); но в cmd за нуль-байтом есть еще всяка куйня, тк исползовал malloc и там брал с запасом на 1,2 больше--segmentation fault, вот может ли это повлиять?
Я не уверен но этот мкдир через систем разве не будет дергать системный mkdir в цикле? Повторюсь что в кодинге под люнь не разбираюсь:3
Мне не надо в цикле вызывать system(), мне надо один раз, но чтобы конкресно, и потом проверить результат вызовом int opendir(), , короче говоря еси бы мне было пох---я бы замутил как ты предлагал еще сразу, номне так не надо. Еще объясню, почему мне надо так сделать--- если выполнять как ты предлогаешь--- syystem("mkdir -p /usr/блабла/бла/бла/бла"); потом надо проверить результат, и потом еще насоздавать целый паровоз директорий в конечной, и в них, и все это проверять? xD, я не настолько наркоман, чтобы делать такой безобразный код), но опять же мона все замутить в двумерный массив, и прогнать в цикле, но там тоже докуя формальностей), вот почему мне надо один раз вызвать system(); а потом просто проверить одну из конецных папок, имхо результат выполнения system() не всегда !=0 при успешном выполнении, и по нему определить создались ли все директории невозможно. а если выполнять в цикле, то и проверять надо в цикле----докуя делов короче...
Я не про вызов систем а про вызов системной процедуры. В подробности того, что ты написал дальше было лень вдаваться, сорри:3
Ы), ты мня не понел--- если мы будем использовать системный вызов на создание директории, то там нельзя поставить ключь Code: -p , но мона проверить возвращенное значение mkdir() , но мне это не надо)). Мне просто надо создать паровоз папок в нужной мне директории xD
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; }
Про быстрее согласен, отписался лиж бы тот типок отстал шкодил я год назад на делфях , сча деньги зарабатываю)) 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; } }
зарабатывай конечно, как запустишь обязательно дай ссылку, создам юзера с ником Code: ;halt # используй системные вызовы, или хотя бы в форке обращайся напрямую к /bin/mkdir
ТС, позаоль поинтересоваться - а зачем тут Си? Как правильно выше заметили - обычного Баша - с головой хватит. Если есть цель "не сдать сорцы врагам" - напиши свой криптер, либо заюзай уже существующие. Опять же, можно скрипт обфусцировать сначала, а потом закриптовать... Вариантов масса.
Ы, скорость работы скрипта на баше и с++, а если бы я на сях не хотел закодить, я бы на перле кодил---там мона к мускулу коннектица итп итд, еси нужные либы инсталировать=). 2- потоки
:facepalm: Тебе ж выше Файлуре продемонстрировал... Ты, считай, транслируешь баш скрипт в код С через вызов system(). К мускулу и из С можно конектица, есличо %)
Ы, чел, про мускул я в курсе. Если бы мне надо было написать на баше--я бы написал, мне надо на сях, по некоторым причинам---я пишу на сях. Про "транслируешь код" ----у мня уже половина программулины на сисколы переделано. PS: троллолодетектед. xD, тема исчерпана.