Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

Взаимодействие процессов

14.12.2011, 13:03. Показов 6147. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста как мне наладить взаимодействие между двумя процессами через каналы.
Вот допустим есть у меня два процесса которые отображают данные через mmap в один файл. А как мне наладить взаимодействие между ними? Как заставить например второй процесс принимать данные из этого mmap, ну вот чтобы он ожидал пока там не появиться сообщение и печатал его сразу после того как оно там появляется. Как заставить его следить за этим каналом между потоками?
Ну и вопрос на засыпку: зачем козе баян, те зачем мне mmap если я и так могу средствами си писать данные в файл, закрывать файл, а во втором процессе в это время открывать файл и считывать данные с файла и тоже закрывать его.

Добавлено через 3 минуты
О том что такое mmap читал здесь так что отталкиваюсь от тех данных.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.12.2011, 13:03
Ответы с готовыми решениями:

Взаимодействие процессов. Сигналы
Создать дерево процессов 1->(2,3) 2->(4,5) 5->6 6->(7,8) Процессы непрерывно обмениваются сигналами 1->(8,7,6) SIGUSR1 ...

Организовать взаимодействие двух процессов через неименованный программный канал
Подскажите, где почитать про это и что надо сделать точно. А то тут лабу задали, а лекции пока не было. Знаю, вы не любите такие темы,...

Взаимодействие процессов
Всем привет. Запаситесь терпением, ибо описывать проблему я буду долго :) Итак, что требуется, в общем. Есть программа на Питоне....

27
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.12.2011, 13:29
Gepar, уточните пожалуйста: вас интересуют два разных процесса или два разных потока одного процесса?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2011, 14:26  [ТС]
talis, ну я написал 5 раз слово процесс что как-бы намекает
Немного вник в суть пока читал википедию: оказывается этот mmap держит всё в оп, а запись производит уже когда закрывать файл, хотя как именно нужно закрывать файл через этот mmap надо ещё сейчас разобраться. Также я немного уточнил своё задание: оно подразумевает создание одного процесса, создание второго из первого (через exec, как мне сказала преподша, и передачу в виде параметра имени моего файла что используется в mmap в первом процессе). Дальше как я понимаю нужно открыть в этом mmap один и тот же файл в двух процессах ну и как-то наладить взаимодействие между процессами, например чтобы второй процесс каждые 5 секунд проверял не изменилось ли содержимое mmap и если изменилось то печатал. Но это всё теория и это всё на словах у меня, сейчас попробую на деле с виртуалкой как-то реализовать свои идеи и проверить правильно ли я понял этот mmap.

Добавлено через 3 минуты
talis, я уже понял почему Вы засомневались между процессами или потоками: в той теме я упомянул потоки так как не сильно вчитывался в задание к сл. лабораторной, теперь вот прочитал и понял что мне нужно делать взаимодействие между процессами.
Взаимодействие же между потоками в принципе можно наладить абсолютно так же, хотя это не рентабельно так как между потоками у нас есть общая память и гораздо проще обмениваться данными через глобальные переменные и передачу указателей на память при создании потоков.
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.12.2011, 14:41
Gepar, пока я вникал в суть вопроса, вы набросали это небольшое сообщение :-) Не знаю, нужен ли вам именно mmap. Я немного изучил тему файлов-очередей в POSIX (FIFO по-другому, или именованные каналы). Вот что удалось набросать:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// writer.c
 
#include <stdio.h>
#include <string.h>
 
#define FIFO_FILE "/tmp/test-c-writer-fifo"
 
int main( void )
{
   puts( "Открываю файл-очередь..." );
 
   if( 0 != mkfifo( FIFO_FILE, 0600 ) ) // создать канал
      perror( "Не могу создать файл-очередь" );
   
   /* открыть его; здесь происходит пауза, пока этот *
    * же файл для чтения не откроет другой процесс   */
   puts( "Жду подключения процесса-читателя..." );
   FILE *fout = fopen( FIFO_FILE, "w" );
   
   if( fout )   
       puts( "Файл-очередь создан" );
   else
   {
       perror( "Не могу открыть файл-очередь" );          
       return -1;
   }
   
   char input[256];
   
   puts( "Введите quit для прекращения" );
   
   // читаем со стандартного ввода и отправляем в именованный канал
   while( putchar( '>' ) && fgets( input, 256, stdin ) && strcmp( input, "quit\n" ) )
   {
      fputs( input, fout );
      fflush( fout ); // выгрузить текст из буфера файлового потока в канал
   }
   
   fclose( fout );
   
   puts( "Удаляю файл-очередь..." );
   
   if( 0 != unlink( FIFO_FILE ) )
      perror( "Не могу удалить файл-очередь" );
   else
      puts( "Готово." );
 
   return 0;
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// reader.c
 
#include <stdio.h>
#include <string.h>
 
#define FIFO_FILE "/tmp/test-c-writer-fifo"
 
int main( void )
{
   puts( "Открываю файл-очередь..." );
 
   if( 0 != mkfifo( FIFO_FILE, 0600 ) ) // создаём канал
      perror( "Не могу создать файл-очередь" );
   
   /* открыть его; здесь происходит пауза, пока этот *
    * же файл для записи не откроет другой процесс   */
   puts( "Жду подключения процесса-писателя..." );
   FILE *fin = fopen( FIFO_FILE, "r" );
   
   if( fin == 0 )
   {
       perror( "Не могу открыть файл-очередь" );          
       return -1;
   }
   
   puts( "Подключился. Далее идут сообщения от процесса-писателя.\n------------------------------------------------------------" );
   
   char input[256];
   
   /* нам повезло: писатель читает со стандартного      *
    * ввода с помощью функции fgets, которая оставляет  *
    * символ переноса строки. этот символ весьма кстати *
    * попадает в канал :-) читаем до него               */
   while( fgets( input, 256, fin ) )
      fputs( input, stdout );
   
   puts( "------------------------------------------------------------\nПисатель закрыл канал. Выхожу." );
   fclose( fin );
 
   return 0;
}
Code
1
[talis@localhost test_c]$ gcc reader.c -o reader.out && gcc writer.c -o writer.out
Code
1
2
3
4
5
6
7
8
9
10
11
[talis@localhost test_c]$ ./reader.out
Открываю файл-очередь...
Жду подключения процесса-писателя...
Подключился. Далее идут сообщения от процесса-писателя.
------------------------------------------------------------
wake up, neo!
the matrix has you
follow the white rabbit
knock-knock, neo
------------------------------------------------------------
Писатель закрыл канал. Выхожу.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
[talis@localhost test_c]$ ./writer.out
Открываю файл-очередь...
Не могу создать файл-очередь: File exists
Жду подключения процесса-читателя...
Файл-очередь создан
Введите quit для прекращения
>wake up, neo!
>the matrix has you
>follow the white rabbit
>knock-knock, neo
>quit
Удаляю файл-очередь...
Готово.
Добавлено через 1 минуту
Цитата Сообщение от Gepar Посмотреть сообщение
Взаимодействие же между потоками в принципе можно наладить абсолютно так же, хотя это не рентабельно так как между потоками у нас есть общая память и гораздо проще обмениваться данными через глобальные переменные и передачу указателей на память при создании потоков.
Ну или через неименованые каналы (pipe).

Добавлено через 3 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
Дальше как я понимаю нужно открыть в этом mmap один и тот же файл в двух процессах ну и как-то наладить взаимодействие между процессами, например чтобы второй процесс каждые 5 секунд проверял не изменилось ли содержимое mmap и если изменилось то печатал.
При помощи fifo мы от этого уходим: чтение блокируется до получения данных. Перекидываться, кстати, можно и бинарными данными через fread и fwrite. Если read и write - это небуферизируемые аналоги fread и fwrite (просто предположение), то можно использовать их. Хотя как это скажется на производительности - это ещё бабушка надвое сказала.

Добавлено через 1 минуту
А чтобы чтение не блокировалось, теоретически можно использовать select. Не знаю, будет ли оно работать с файлами-очередями, но с сокетами у меня прокатывало.
2
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2011, 14:43  [ТС]
talis, mkfifo тоже надо, это следующий пункт но сейчас я пытаюсь разобраться с первым: c mmap так как я пока что не могу найти как писать и читать данные именно с использованием mmap, или же когда я создаю этот канал через mmap и передаю дескриптор файла то операции read и write автоматически начинают использовать существующий канал
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.12.2011, 14:55
Gepar, судя по манам, нет. mmap проецирует содержимое файла на какую-то часть виртуального адресного пространства вашего процесса. Думаю, вам нужно писать и читать по смещениям относительно начала проецированной области, плюс, возможно, как-то синхронизировать содержимое памяти с файлом. Если возвращённый адрес хранится в void * addr, то:

C
1
strcpy( addr + 20, "some string" );
Записать "some string" по адресу (addr + 20). Теоретически, используя символьные константы, можно разбить память на "переменные":

C
1
2
3
4
5
#define SH_STRING          ( (char*)(addr) )
#define SH_STRING_SIZE     64
#define SH_STRING_CHANGED  ( (int*)(SH_STRING + SH_STRING_SIZE) )
#define SH_TIME_UP         ( (int*)(SH_STRING_CHANGED + sizeof(int)) )  // если SH_STRING_CHANGED имеет "тип" int
// ...
Но мне почему-то кажется, что не может быть всё так скучно и неинтересно. Должен быть способ размечать эту область более цивилизованными методами. Хотя не могу ничего утверждать.
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2011, 15:07  [ТС]
Пока пытаюсь использовать mmap возник вопрос: как задать флаги для открытия файла через open так чтобы он создавался либо открывался, если написать O_CREATE | O_TRUNC то он если файл уже существует не открывается и выдаёт ошибку.

Добавлено через 4 минуты
Хм, вроде получилось читать данные с mmap, простенько, без указания размера страницы памяти я конечно сделал, но сработало.
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.12.2011, 15:07
Вот что выдали мои маны:
O_TRUNC Если файл уже существует, является обычным файлом, а режим
открытия позволяет запись (то бишь это O_RDWR или O_WRONLY), то
он будет обрезан до нулевой длины. Если файл является FIFO или
устройством терминала, то флаг O_TRUNC игнорируется. В
противном случае действие O_TRUNC не описано. (На многих
версиях Linux этот флаг будет игнорирован; на других версиях
будет возвращена ошибка.)
Почему бы не сделать fopen( "myfile", "w" ), который откроет файл для записи ("w"), удалив все данные (в отличии от режима "a")?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2011, 15:09  [ТС]
В общем-то я создал mmap для записи вот так
C
1
address=mmap(NULL,strlen(data)+1,PROT_WRITE,MAP_SHARED,fd,offset);
и потом записав данные смог их читать вот так
C
1
printf("\n%s",address);
Первый параметр mmap это размер страницы памяти, но я не понял пока что зачем его указывать если можно и с NULL.
1
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.12.2011, 15:10
Если вам только создать, то есть creat.

creat эквивалентен open с flags, равными O_CREAT | O_WRONLY | O_TRUNC.
Хотя, судя по флагам, ваш вариант O_CREAT | O_TURNC должен был сработать
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2011, 15:11  [ТС]
talis, ну open возвращает дескриптор в виде int, а fopen в виде FILE, не знаю понравиться ли mmap получать дескиптор в виде FILE, сейчас попробую.
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.12.2011, 15:13
Цитата Сообщение от Gepar Посмотреть сообщение
Первый параметр mmap это размер страницы памяти, но я не понял пока что зачем его указывать если можно и с NULL.
Не правда.

void *mmap(void *start, size_t length, int prot, int flags,
int fd, off_t offset);
DESCRIPTION
The mmap() function asks to map length bytes starting at offset offset from the file (or other object) specified by the file descriptor fd into memory, preferably at address start. This latter address is a hint only, and is usually specified as 0. The actual place where the object is mapped is returned by mmap().
Что означает: "создаёт проецируемую область ... предпочтительно на адресе start. Этот адрес - просто подсказка, и обычно выставляется в ноль. Реальное место размещения возвращается.

Добавлено через 24 секунды
Цитата Сообщение от Gepar Посмотреть сообщение
talis, ну open возвращает дескриптор в виде int, а fopen в виде FILE, не знаю понравиться ли mmap получать дескиптор в виде FILE, сейчас попробую.
Не сообразил, извините.
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2011, 15:16  [ТС]
Цитата Сообщение от talis Посмотреть сообщение
creat эквивалентен open с flags, равными O_CREAT | O_WRONLY | O_TRUNC.
Как не странно но если написать O_CREAT без O_TRUNC то оно открывает существующий файл если он уже есть для дозаписи, странно это, но ведь работает.

Добавлено через 50 секунд
Цитата Сообщение от talis Посмотреть сообщение
Что означает: "создаёт проецируемую область ... предпочтительно на адресе start. Этот адрес - просто подсказка, и обычно выставляется в ноль. Реальное место размещения возвращается.
А, ну раз подсказка тогда хорошо, я думал это точное указание будет куда писать.

Добавлено через 1 минуту
Так, теперь нужно разобраться с вызовом exec и передачей в виде его параметра имени файла что я использую в mmap чтобы другой процесс знал что ему жевать.
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.12.2011, 15:17
Цитата Сообщение от Gepar Посмотреть сообщение
Как не странно но если написать O_CREAT без O_TRUNC то оно открывает существующий файл если он уже есть для дозаписи, странно это, но ведь работает.
Как говорят маны:

Цитата Сообщение от talis Посмотреть сообщение
На многих версиях Linux этот флаг будет игнорирован; на других версиях будет возвращена ошибка.
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2011, 15:22  [ТС]
Цитата Сообщение от talis Посмотреть сообщение
На многих версиях Linux этот флаг будет игнорирован; на других версиях будет возвращена ошибка.
Нет, тут интереснее всё, только с O_TRUNC файл открывается для дозаписи (или ошибка если файла нет),с только O_CREATE файл создаётся/открывается для дозаписи. Те Knoppix этот не игнорирует O_TRUNC и не выдаёт ошибку если его использовать (что видно из первого случая), но вот когда есть комбо из O_TRUNC и O_CREATE то файл уже не дописывается, а только создаётся если его не было (или ошибка если файл существует). Те в данном случае использование двух флагов этих вместе отменяет O_TRUNC каким-то способом.
1
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.12.2011, 15:42
Цитата Сообщение от Gepar Посмотреть сообщение
Так, теперь нужно разобраться с вызовом exec и передачей в виде его параметра имени файла что я использую в mmap чтобы другой процесс знал что ему жевать.
ммм.. а если просто использовать одинаковое имя файла в /tmp? или форкнуться?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2011, 18:05  [ТС]
Цитата Сообщение от talis Посмотреть сообщение
ммм.. а если просто использовать одинаковое имя файла в /tmp?
В смысле?
В общем-то у меня есть два файла, допустим a.out пишет данные в mmap, b.out читает эти данные. Мне нужно в начале a.out запустить как-то b.out с передачей ему параметров, как это сделать? Всё равно через что, я по поводу exec читаю и там написано что оно создаёт копию процесса, одногрупник говорил что там как-то хитро потом надо заменять эту копию на нужный процесс но я не знаю как именно это реализовать, а вообще почему нет ничего такого чтобы просто запустить процесс/файл на выполнение, какой-то там run чтоли. Ну только без системного вызова из консоли когда на экран будет выведено что-то типа "./b.out параметр1 параметр2" - это будет плохой вариант

Добавлено через 31 минуту
Какой же странный этот линукс, просидел пол часа только чтобы найти странность:
если я пытаюсь вызвать другой процесс через execv() после того как открыл какой-то файл то вызов игнорируется! Вот зачем такое сделано? Ведь если поместить вызов execv() до открытия файла то всё хорошо, а если сразу же после того как файл был открыт то ничего не получается.

Добавлено через 1 час 11 минут
Экспериментирую с execv, только мне интересно как он определяет что передавать в argc создаваемому процессу? Так как в итоге он у меня создаёт процесс с 6ю аргументами, тогда как второй аргумент при создании процесса через него у меня char* arg[3].

Добавлено через 20 минут
И всё же я никак не могу понять почему если сделать так
C
1
2
3
4
5
6
int main()
{
    printf("Start main\n\n");
    int resWr=0;
    int fd;//file deskriptor
              execv(processReceiver,arg);
То второй процесс запускается и всё ок.
А если сделать так
C
1
2
3
4
5
6
7
int main()
{
    printf("Start main\n\n");
    int resWr=0;
    int fd;//file deskriptor
              fd=open(fileName,(O_CREAT|O_RDWR));
              execv(processReceiver,arg);
То процесс запускаться не будет вообще! Вот как это можно объяснить?
0
Заблокирован
14.12.2011, 18:19
что в errno?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2011, 19:14  [ТС]
LosAngeles, Bad address.
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.12.2011, 19:22
Цитата Сообщение от Gepar Посмотреть сообщение
Всё равно через что, я по поводу exec читаю и там написано что оно создаёт копию процесса, одногрупник говорил что там как-то хитро потом надо заменять эту копию на нужный процесс но я не знаю как именно это реализовать, а вообще почему нет ничего такого чтобы просто запустить процесс/файл на выполнение, какой-то там run чтоли.
Думаю, имелось ввиду, что есть некоторые функции семейства exec, которые меняют исполняемый образ на другой. Нужно форкнуться, а затем из-под клона заменить его образ на образ нужной программы. Впрочем, execv, вроде, не она.

Цитата Сообщение от Gepar Посмотреть сообщение
Bad address.
На работе когда пробовал запустить "echo" с аргументами, то же самое имел. Или что-то вроде "некорректное имя файла", когда запускал "/bin/echo". Дома линукс на машине, к инету не подключенной, но если очень надо, могу продолжить изыскания.

Маны на английском
argv is an array of argument strings passed to the new program. By convention, the first of these strings should contain the filename associated with the file being executed. envp is an array of strings, conventionally of the form key=value, which are passed as environment to the new program. Both argv and envp must be terminated by a NULL pointer.


Перевод
argv - это массив строк-аргументов, передаваемых новой программе. По соглашению, первая из этих строк должна содержать имя файла, ассоциированного с исполняемой программой. envp - это массив строк, по соглашению в виде ключ=значение, которые передаются запускаемой программе как переменные окружения. И argv, и envp должны завершаться нулевым указателем (NULL).


Пример из манов
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* execve.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int
main(int argc, char *argv[])
{
    char *newargv[] = { NULL, "hello", "world", NULL };
    char *newenviron[] = { NULL };
 
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <file-to-exec>\n", argv[0]);
        exit(EXIT_FAILURE); 
    }
 
    newargv[0] = argv[1];
 
    execve(argv[1], newargv, newenviron);
    perror("execve"); /* execve() only returns on error */
    exit(EXIT_FAILURE);
}
We can use the second program to exec the first as follows:

Bash
1
2
3
4
5
6
$ cc myecho.c -o myecho
$ cc execve.c -o execve
$ ./execve ./myecho
argv[0]: ./myecho
argv[1]: hello
argv[2]: world
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2011, 19:22
Помогаю со студенческими работами здесь

Взаимодействие процессов
Нужно написать задачу, в которой дано 10 процессов (там P1, P2, …, Р10, например) Функционирование и взаимодействие процессов следующее: ...

Взаимодействие процессов / WinAPI
Доброе время суток, форумчане! Прощу вашей помощи! :help: Для знающих и опытных программистов, кто работал на WinAPI, это задачка...

Взаимодействие двух процессов
Помогите пожалуйста сделать две нити. первая нить &quot;Писатель&quot; вторая нить &quot;Читатель&quot; Писатель unit FirstUnit; ...

Взаимодействие процессов в Windows
Есть 2 процесса, которые взаимодействуют с помощью очереди сообщений,один процесс размещает сообщение, которое вводится с клавиатуры,...

Взаимодействие 2-ух процессов через разделяемую память
Как получить из программы A доступ к файлу, отображаемому в адресное пространство с помощью программы B (mmap использован в программе B) ?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru