2014-01-16 2 views
2

В C я использую «открытый()» для создания и открытых файлов:Создание нового каталога без MKDIR()

fd = open(fileName, O_CREAT | O_RDWR, 0644); 

если «имя_файла» включает в себя каталог файл создается только если каталог существует, и приложение имеет разрешение на запись в этот каталог.

Если каталог не существует, функция «open()» возвращает ошибку, и я хотел бы создать каталог.

С помощью makedir (см. Ниже) Я могу создать каталог.

int mkdir(const char *path, mode_t mode); 

Мне было интересно, существуют ли другие способы создания каталога? Я считаю, что мы также можем использовать ioctl()? Есть ли больше альтернатив?

Я прошу об этом, потому что в нашем коде мы не разрешено использовать mkdir.

+1

Хм ... Я полагаю, что система («mkdir foo») запрещена? –

+1

Поскольку каталог представлен как файл, я думаю, вы можете создать файл и поиграть с атрибутами, чтобы попасть туда. – Laz

+1

кажется странным, что вам не разрешено использовать известную команду, например mkdir, но вместо этого нужно, чтобы взломать ее.просто мой 2c –

ответ

4

Мне было интересно, существуют ли другие способы создания каталога? Я считаю, что мы также можем использовать ioctl()?

По меньшей мере, для Linux и HP-UX mkdir является системным вызовом самостоятельно.

Итак, нет, нет другого способа создать каталог, по крайней мере, не на Linux - другие системы могут реализовать создание каталога по-разному. Но в любой разумной системе я ожидал бы, что создание каталогов будет привилегированной операцией, поэтому вам нужно пройти через ядро.

Единственным немного отличающимся подходом было бы выполнить системный вызов напрямую, минуя библиотеку времени выполнения C. В сборке NASM синтаксиса на архитектуре i386, это будет выглядеть примерно так

mkdir: 
    mov  eax, 39   ; System-call "sys_mkdir" 
    mov  ebx, dirName ; directory name to create 
    mov  ecx, 0x755  ; creation mode 
    int  80H    ; call sys_mkdir 

Однако, это не то, что вы обычно делаете, так как она полностью зависит от системы. Для переключения на другой процессор потребуется другая настройка регистра и/или разные инструкции - это то, что инкапсулирует библиотека времени выполнения C.

Смотрите также

0

Драйвер ядра может создать папку с помощью

struct file *fp = (struct file *) NULL; 
fp = filp_open("/home/testdir", O_DIRECTORY|O_CREAT, S_IRUSR); 

могу я magine в некоторых ситуациях, когда драйвер «make_dir», который создает большое количество папок, будет быстрее, чем вызов mkdir для каждой папки.

Смежные вопросы