* [devel] IPC и сборка мусора @ 2003-09-07 10:31 Denis Ovsienko 2003-09-07 13:19 ` Dmitry V. Levin 0 siblings, 1 reply; 6+ messages in thread From: Denis Ovsienko @ 2003-09-07 10:31 UTC (permalink / raw) To: devel Целью данного письма является показать, что можно программировать IPC так, чтобы не оставлять мусор, причём это не особенности замшелых ядер, описанные в устаревших книжках. Вот текст программы: #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #define SIZE 1024 int main (int argc, char * argv[]) { key_t key = ftok (argv[0], 1); int shmid = shmget (key, SIZE, IPC_CREAT | 0600); void * memory = NULL; if (shmid == -1) return 1; memory = shmat (shmid, NULL, 0); if (argc >= 2 && !strcmp (argv[1], "rm")) shmctl (shmid, IPC_RMID, NULL); return 0; } Вот 3 последовательных запуска. Прошу обратить внимание на уже существующий до запуска сегмент: nattch=2, status=dest. После двух shmdt() либо после простого завершения 2-х подсоединённых процессов сегмент будет удалён. Но вернёмся к тесту: [pilot@m46 devel]$ ipcs ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 27131910 pilot 777 393216 2 dest ------ Semaphore Arrays -------- key semid owner perms nsems ------ Message Queues -------- key msqid owner perms used-bytes messages [pilot@m46 devel]$ ./IPCtest rm [pilot@m46 devel]$ ipcs ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 27131910 pilot 777 393216 2 dest ------ Semaphore Arrays -------- key semid owner perms nsems ------ Message Queues -------- key msqid owner perms used-bytes messages [pilot@m46 devel]$ ./IPCtest [pilot@m46 devel]$ ipcs ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x0102be47 53968897 pilot 600 1024 0 0x00000000 27131910 pilot 777 393216 2 dest ------ Semaphore Arrays -------- key semid owner perms nsems ------ Message Queues -------- key msqid owner perms used-bytes messages [pilot@m46 devel]$ ./IPCtest rm [pilot@m46 devel]$ ipcs ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 27131910 pilot 777 393216 2 dest ------ Semaphore Arrays -------- key semid owner perms nsems ------ Message Queues -------- key msqid owner perms used-bytes messages [pilot@m46 devel]$ uname -a Linux m46.pilot 2.4.20-alt5-pim #1 Tue Apr 22 22:09:54 EEST 2003 i686 unknown unknown GNU/Linux Вот и всё, и не нужно говорить, что это не работает. Точно такое же поведение можно ожидать и на других POSIX-системах. ALTLinux Master 2.2, ядро 2.4.20-alt5-up с включенным IGMP+PIM. -- DO4-UANIC ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] IPC и сборка мусора 2003-09-07 10:31 [devel] IPC и сборка мусора Denis Ovsienko @ 2003-09-07 13:19 ` Dmitry V. Levin 2003-09-07 15:01 ` Denis Ovsienko 0 siblings, 1 reply; 6+ messages in thread From: Dmitry V. Levin @ 2003-09-07 13:19 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 1040 bytes --] On Sun, Sep 07, 2003 at 01:31:35PM +0300, Denis Ovsienko wrote: [...] > Вот и всё, и не нужно говорить, что это не работает. Точно такое же Это не работает. Точнее говоря, приведённый тест не имеет никакого отношения к обсуждаемой задаче. Цитирую susv3/functions/semctl.html: IPC_RMID Remove the semaphore identifier specified by semid from the system and destroy the set of semaphores and semid_ds data structure associated with it. Цитирую susv3/functions/shmctl.html: IPC_RMID Remove the shared memory identifier specified by shmid from the system and destroy the shared memory segment and shmid_ds data structure associated with it. Цитирую susv3/functions/msgctl.html: IPC_RMID Remove the message queue identifier specified by msqid from the system and destroy the message queue and msqid_ds data structure associated with it. Короче говоря, IPC_RMID сразу уничтожает ресурс. Ни о какой уборке мусора не может быть и речи. Все остальные процессы, обращающиеся к этому ресурсу, получают (в лучшем случае) ошибку EIDRM. -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] IPC и сборка мусора 2003-09-07 13:19 ` Dmitry V. Levin @ 2003-09-07 15:01 ` Denis Ovsienko 2003-09-07 15:26 ` Dmitry V. Levin 0 siblings, 1 reply; 6+ messages in thread From: Denis Ovsienko @ 2003-09-07 15:01 UTC (permalink / raw) To: ALT Devel discussion list > Это не работает. Точнее говоря, приведённый тест не имеет никакого > отношения к обсуждаемой задаче. Работает. Имеет. Либо задача решается не теми средствами. > Короче говоря, IPC_RMID сразу уничтожает ресурс. Ни о какой уборке мусора > не может быть и речи. Все остальные процессы, обращающиеся к этому > ресурсу, получают (в лучшем случае) ошибку EIDRM. Это не так, и даже из лога сессии это видно. Установка флага SHM_DEST не мешает другим процессам вызывать shmat(), я это проверял практически. И не уничтожает ресурс, пока счётчик присоединённых процессов больше нуля. -- DO4-UANIC ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] IPC и сборка мусора 2003-09-07 15:01 ` Denis Ovsienko @ 2003-09-07 15:26 ` Dmitry V. Levin 2003-09-08 9:35 ` Denis Ovsienko 0 siblings, 1 reply; 6+ messages in thread From: Dmitry V. Levin @ 2003-09-07 15:26 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1.1: Type: text/plain, Size: 1747 bytes --] On Sun, Sep 07, 2003 at 06:01:36PM +0300, Denis Ovsienko wrote: > > Это не работает. Точнее говоря, приведённый тест не имеет никакого > > отношения к обсуждаемой задаче. > Работает. Имеет. Либо задача решается не теми средствами. На самом деле задача формулируется так: гарантировать освобождение ресурсов по окончании сборки. Другими словами, на клиента рассчитывать нельзя. > > Короче говоря, IPC_RMID сразу уничтожает ресурс. Ни о какой уборке мусора > > не может быть и речи. Все остальные процессы, обращающиеся к этому > > ресурсу, получают (в лучшем случае) ошибку EIDRM. > Это не так, и даже из лога сессии это видно. Установка флага SHM_DEST не > мешает другим процессам вызывать shmat(), я это проверял практически. И не > уничтожает ресурс, пока счётчик присоединённых процессов больше нуля. Как всегда, истина где-то посередине. То, что работает с shm, не работает с sem и msg. Вот пример того, что происходит с очередями: [user@localhost user]$ ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages [user@localhost user]$ ./msgtest & [1] 32040 [user@localhost user]$ ./msgtest & [2] 32041 [user@localhost user]$ ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x01070367 3866624 user 600 0 0 [user@localhost user]$ ./msgtest rm [user@localhost user]$ ./msgtest: msgsnd: Invalid argument [2]+ Exit 1 ./msgtest ./msgtest: msgsnd: Invalid argument [1]- Exit 1 ./msgtest ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages P.S. fakeroot использует только sem и msg. -- ldv [-- Attachment #1.2: msgtest.c --] [-- Type: text/plain, Size: 741 bytes --] #include <errno.h> #include <error.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/msg.h> #define SIZE 1024 struct msgbuf { long mtype; char mtext[SIZE]; }; int main (int argc, const char *argv[]) { key_t key = ftok (argv[0], 1); int msqid = msgget (key, IPC_CREAT | 0600); if (msqid == -1) error (1, errno, "msgget"); if (argc >= 2 && !strcmp (argv[1], "rm")) { if (msgctl (msqid, IPC_RMID, 0) == -1) error (1, errno, "msgctl"); return 0; } for (;;) { struct msgbuf msg; sleep (1); msg.mtype = 1; if (msgsnd (msqid, &msg, SIZE, 0) == -1) error (1, errno, "msgsnd"); if (msgrcv (msqid, &msg, SIZE, 1, 0) == -1) error (1, errno, "msgrcv"); } return 0; } [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] IPC и сборка мусора 2003-09-07 15:26 ` Dmitry V. Levin @ 2003-09-08 9:35 ` Denis Ovsienko 2003-09-08 10:17 ` Dmitry V. Levin 0 siblings, 1 reply; 6+ messages in thread From: Denis Ovsienko @ 2003-09-08 9:35 UTC (permalink / raw) To: ALT Devel discussion list > На самом деле задача формулируется так: > гарантировать освобождение ресурсов по окончании сборки. > Другими словами, на клиента рассчитывать нельзя. Ясно. > Как всегда, истина где-то посередине. Пожалуй, действительно. > То, что работает с shm, не работает с sem и msg. > > Вот пример того, что происходит с очередями: [...] > P.S. fakeroot использует только sem и msg. А fifo-файлами здесь обойтись нельзя? Проще будет чистить. -- DO4-UANIC ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] IPC и сборка мусора 2003-09-08 9:35 ` Denis Ovsienko @ 2003-09-08 10:17 ` Dmitry V. Levin 0 siblings, 0 replies; 6+ messages in thread From: Dmitry V. Levin @ 2003-09-08 10:17 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 736 bytes --] On Mon, Sep 08, 2003 at 12:35:10PM +0300, Denis Ovsienko wrote: > > На самом деле задача формулируется так: > > гарантировать освобождение ресурсов по окончании сборки. > > Другими словами, на клиента рассчитывать нельзя. > Ясно. > > > Как всегда, истина где-то посередине. > Пожалуй, действительно. > > > То, что работает с shm, не работает с sem и msg. > > > > Вот пример того, что происходит с очередями: > [...] > > P.S. fakeroot использует только sem и msg. > А fifo-файлами здесь обойтись нельзя? Проще будет чистить. Насколько я понимаю, fakeroot'у нельзя использовать файловые дескрипторы. Видимо, авторы считают, что приложение может легко и не задумываясь эти дескрипторы закрыть. Думаю, что они (авторы) правы. -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2003-09-08 10:17 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2003-09-07 10:31 [devel] IPC и сборка мусора Denis Ovsienko 2003-09-07 13:19 ` Dmitry V. Levin 2003-09-07 15:01 ` Denis Ovsienko 2003-09-07 15:26 ` Dmitry V. Levin 2003-09-08 9:35 ` Denis Ovsienko 2003-09-08 10:17 ` Dmitry V. Levin
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git