Не работает mknod()

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
eJ
проходил мимо
Сообщения: 4
Зарегистрирован: 2008-06-10 12:24:53

Не работает mknod()

Непрочитанное сообщение eJ » 2008-06-16 21:23:49

Народ, не работает банальный код:

Код: Выделить всё

#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{

    umask(0);
    if (mknod("test", S_IFREG, 0))
    {
        perror("mknod");
        return 1;
    }
    return 0;
}
Компиляю так:

Код: Выделить всё

cc -Wall -lc main.c
Ошибка такая:

Код: Выделить всё

mknod: Invalid argument

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Не работает mknod()

Непрочитанное сообщение zingel » 2008-06-17 6:06:50

ну если я Вас верно понял, то вот так надо:

Код: Выделить всё

[root@zingel ~]# diff -uNr ~/code/other/old.c ~/code/other/1.c
--- /root/code/other/old.c      2008-06-17 06:05:10.000000000 +0300
+++ /root/code/other/1.c        2008-06-17 06:05:06.000000000 +0300
@@ -3,11 +3,16 @@
 #include <string.h>
 #include <errno.h>

+#define OP '-c'
+#define NUM 1
+#define NAME '/dev/test'
+#define ALL (OP, NUM,NAME)
+
 int main(int argc, char *argv[])
 {

-    umask(0);
-    if (mknod("test", S_IFREG, 0))
+    umask(0644);
+    if (mknod ALL, S_IFREG, 0 )
     {
         perror("mknod");
         return 1;

работает:

Код: Выделить всё

[root@zingel ~/code/other]# objdump -T a.out | perl -lne 'if(/(\_.*)/){print $1}'
_1.0    _init_tls
__progname
_1.0    mknod
_1.0    umask
_1.0    exit
_end
_1.0    atexit
_Jv_RegisterClasses
UPD:

Вот так круче:

Код: Выделить всё

#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

/* определяем передачу параметра "-с" команде mknod, тип устройства, без этого не будет работать и отдаст нормальную Invalid argument */

#ifndef OP
 #define OP "-c"
#endif

/* Определяем название устройства и путь его же */
#ifndef NAME
 #define NAME "/dev/test"
#endif

/*Поскольку юзается S_IFREG, непортабельный регулярный семафор, определяем единицу */
#define NUM 1

/* Всё вместе складываем*/
#define ALL (OP, NUM,NAME)

int main(int argc, char *argv[])
{

    umask(0644); /* маску меняем на стандартную для /dev */
    if (mknod ALL, S_IFREG, 0 )
    {
        perror("mknod");
        return 1;
    }
    return 0;
}

 /* если не создастся ничего и завершится ошибкой, то идём смело и читаем man 2 mknod */

Z301171463546 - можно пожертвовать мне денег

eJ
проходил мимо
Сообщения: 4
Зарегистрирован: 2008-06-10 12:24:53

Re: Не работает mknod()

Непрочитанное сообщение eJ » 2008-06-17 8:36:44

У тебя неправильный код!

Вот это:

Код: Выделить всё

int main(int argc, char *argv[])
{

    umask(0644); /* маску меняем на стандартную для /dev */
    if (mknod ALL, S_IFREG, 0 )
    {
        perror("mknod");
        return 1;
    }
    return 0;
}
Раскладывается cc так:

Код: Выделить всё

int main(int argc, char *argv[])
{

    umask(0644);
    if (mknod ("-c", 1,"/dev/test"), 0100000, 0 )
    {
        perror("mknod");
        return 1;
    }
    return 0;
}
Разумеется он не завершится с ошибкой. Что у тебя проверяет if?

UPD:
А надо мне создать простой файл с обычными правами доступа 0644 с помощью mknod.

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Не работает mknod()

Непрочитанное сообщение zingel » 2008-06-17 9:18:04

как-то по-идусски вышло, я думал нужен вариант под сокет или что-то ~такое (плохо сплю последне время), держи:

Код: Выделить всё

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

#ifndef COPY
 #define COPY  printf("Created by zingel [aka 666.root] 10:11 17.06.2008\n")
#endif

int main(int argc, char ** argv)
{
        int krevedko;

        if (argc < 2) {
                COPY;
                printf("Usage %s filename\n", argv[0]);
                return 1;
        }

        krevedko = mknod(argv[1], S_IFREG | 0644, 0);
        if (krevedko) {
                printf("mknod(%s) error: %s\n", argv[1], strerror(errno));
        }
        return krevedko;
}
Да прибуедт с тобой сатана.
Z301171463546 - можно пожертвовать мне денег

eJ
проходил мимо
Сообщения: 4
Зарегистрирован: 2008-06-10 12:24:53

Re: Не работает mknod()

Непрочитанное сообщение eJ » 2008-06-17 11:38:55

Все равно какая-то херня, извиняюсь за выражение.
Может mknod под FreeBSD 7.0 не умеет создавать S_IFREG файлы? :cf:

Покажи uname -a.

Вот мой:

Код: Выделить всё

FreeBSD root.nill.org.ru 7.0-RELEASE-p1 FreeBSD 7.0-RELEASE-p1 #0: Tue Jan  1 03:20:51 MSK 2002     root@root.nill.org.ru:/usr/obj/usr/src/sys/ATHLON  i386

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Не работает mknod()

Непрочитанное сообщение zingel » 2008-06-17 11:46:32

Код: Выделить всё

[root@zingel ~/code]# uname -a
FreeBSD zingel.dubki.ru 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Wed Apr 23 22:39:55 EEST 2008     root@zingel.dubki.ru:/usr/obj/usr/src/sys/BEASTIE  i386
действительно, какая-то херня, код чистый на 100%, баг mknod? странно...
Z301171463546 - можно пожертвовать мне денег

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Не работает mknod()

Непрочитанное сообщение paradox » 2008-06-17 12:19:48

а вручную ?
не из с кода

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Не работает mknod()

Непрочитанное сообщение zingel » 2008-06-17 12:20:20

ой косяк, ой баг, надо отписать в bugs

Код: Выделить всё

44650: sigprocmask(SIG_SETMASK,0x0,0x0)          = 0 (0x0)
44650: mknod("file",0100666,-1077941728)         ERR#22 'Invalid argument'
44650: fstat(1,{mode=crw------- ,inode=100,size=0,blksize=4096}) = 0 (0x0)
44650: __sysctl(0xbfbfe1fc,0x2,0x281698c0,0xbfbfe208,0x0,0x0) = 0 (0x0)
44650: __sysctl(0xbfbfdd38,0x2,0x2817603c,0xbfbfdd40,0x0,0x0) = 0 (0x0)
44650: __sysctl(0xbfbfdd88,0x2,0xbfbfdd94,0xbfbfdd98,0x0,0x0) = 0 (0x0)
44650: readlink("/etc/malloc.conf",0xbfbfddfb,1024) ERR#2 'No such file or directory'
44650: issetugid(0x2815700a,0xbfbfddfb,0x400,0xbfbfe208,0x0,0x0) = 0 (0x0)
44650: break(0x8100000)                          = 0 (0x0)
44650: __sysctl(0xbfbfe0a4,0x2,0xbfbfe0ac,0xbfbfe0b0,0x0,0x0) = 0 (0x0)
44650: mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 672632832 (0x28179000)
44650: munmap(0x28179000,552960)                 = 0 (0x0)
44650: munmap(0x28300000,495616)                 = 0 (0x0)
44650: ioctl(1,TIOCGETA,0xbfbfe228)              = 0 (0x0)
mknod(file) error: Invalid argument
44650: write(1,"mknod(file) error: Invalid argum"...,36) = 36 (0x24)
44650: process exit, rval = 255
Z301171463546 - можно пожертвовать мне денег

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Не работает mknod()

Непрочитанное сообщение zingel » 2008-06-17 12:33:20

вручную всё ок:

Код: Выделить всё

[root@zingel ~]# mknod fuckass c 1 0
[root@zingel ~]# ls -la fuckass
crw-r--r--  1 root  wheel    1,   0 Jun 17 12:29 fuckass
Z301171463546 - можно пожертвовать мне денег

eJ
проходил мимо
Сообщения: 4
Зарегистрирован: 2008-06-10 12:24:53

Re: Не работает mknod()

Непрочитанное сообщение eJ » 2008-06-17 16:33:28

zingel писал(а):ой косяк, ой баг, надо отписать в bugs

Код: Выделить всё

44650: sigprocmask(SIG_SETMASK,0x0,0x0)          = 0 (0x0)
44650: mknod("file",0100666,-1077941728)         ERR#22 'Invalid argument'
44650: fstat(1,{mode=crw------- ,inode=100,size=0,blksize=4096}) = 0 (0x0)
44650: __sysctl(0xbfbfe1fc,0x2,0x281698c0,0xbfbfe208,0x0,0x0) = 0 (0x0)
44650: __sysctl(0xbfbfdd38,0x2,0x2817603c,0xbfbfdd40,0x0,0x0) = 0 (0x0)
44650: __sysctl(0xbfbfdd88,0x2,0xbfbfdd94,0xbfbfdd98,0x0,0x0) = 0 (0x0)
44650: readlink("/etc/malloc.conf",0xbfbfddfb,1024) ERR#2 'No such file or directory'
44650: issetugid(0x2815700a,0xbfbfddfb,0x400,0xbfbfe208,0x0,0x0) = 0 (0x0)
44650: break(0x8100000)                          = 0 (0x0)
44650: __sysctl(0xbfbfe0a4,0x2,0xbfbfe0ac,0xbfbfe0b0,0x0,0x0) = 0 (0x0)
44650: mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 672632832 (0x28179000)
44650: munmap(0x28179000,552960)                 = 0 (0x0)
44650: munmap(0x28300000,495616)                 = 0 (0x0)
44650: ioctl(1,TIOCGETA,0xbfbfe228)              = 0 (0x0)
mknod(file) error: Invalid argument
44650: write(1,"mknod(file) error: Invalid argum"...,36) = 36 (0x24)
44650: process exit, rval = 255
Значит я не один такой. Это хорошо. :Yahoo!:

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Не работает mknod()

Непрочитанное сообщение paradox » 2008-06-17 16:40:04

утилита mknod
флаг S_IFREG
не юзает

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Не работает mknod()

Непрочитанное сообщение zingel » 2008-06-18 2:03:40

это без разницы, это семафоры POSIX, для mknod используется

Код: Выделить всё

S_IFIFO 	 FIFO-special     												
S_IFCHR        Character-special (non-portable)     												
S_IFDIR 	Directory (non-portable)     												
S_IFBLK 	Block-special (non-portable)     												
S_IFREG        Regular (non-portable)   
Z301171463546 - можно пожертвовать мне денег

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Не работает mknod()

Непрочитанное сообщение zingel » 2008-06-18 4:08:34

paradox

Каюсь, мкнод использует всего два семафора, сука S_IFCHR и S_IFBLK

Код: Выделить всё

File /usr/src/sbin/mknod/mknod.c Row 117
.................
 mode = 0666;
        if (argv[2][0] == 'c')
                mode |= S_IFCHR;
        else if (argv[2][0] == 'b')
                mode |= S_IFBLK;
        else
................

Код: Выделить всё

[root@zingel ~/code]# cat test.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

#ifndef COPY
#define COPY  printf("Created by zingel [aka 666.root] 10:11 17.06.2008\n")
#endif

int main(int argc, char ** argv)
{
        int krevedko;

        if (argc < 2) {
                COPY;
                printf("Usage %s filename\n", argv[0]);
                return 1;
        }

        krevedko = mknod(argv[1], S_IFCHR | 0666, 0);
        if (krevedko) {
                printf("mknod(%s) error: %s\n", argv[1], strerror(errno));
        }
        return krevedko;
}
[root@zingel ~/code]# gcc -o test test.c
[root@zingel ~/code]# ./test device0
[root@zingel ~/code]# ls -la device0
crw-r--r--  1 root  wheel    0,   0 Jun 18 04:05 device0

Блин надо добавить остальные семафоры, но это по-моему в 8 версии уже есть....

Код: Выделить всё

--- /usr/src/sbin/mknod/mknod.c 2008-06-18 04:23:14.000000000 +0300
+++ /root/code/mknod-new.c      2008-06-18 04:24:43.000000000 +0300
@@ -123,6 +123,10 @@
                mode |= S_IFCHR;
        else if (argv[2][0] == 'b')
                mode |= S_IFBLK;
+       else if (argv[2][0] == 'd')
+               mode |= S_IFDIR;
+       else if (argv[2][0] == 'e')
+               mode |= S_IFREG;
        else
                errx(1, "node must be type 'b' or 'c'");
UPD:

а вообще, нах они нужны, 2 первых вполне хватит.
Z301171463546 - можно пожертвовать мне денег