Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/43: Рейтинг темы: голосов - 43, средняя оценка - 4.79
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72

Передача считанного файла через pipe

11.10.2013, 17:30. Показов 8284. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
прошу помощи разобраться с чтением файла и передачей прочитанных данных через анонимный pipe

сам смысл задачи:программа запускается из консоли с двумя аргументами - стандартная команда из cmd и имя файла, в которой хранятся входные данные для самой команды..
пока застрял на осознании как работать с каналами в winapi.. в unix, ИМХО, проще как то..

есть набросок кода, но я не удивлюсь, если я там и близко не подошел к поставленной задаче.. собственно как исправить это чудовище, чтобы появилась возможность считанные данные запихать в новый процесс?
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
50
51
52
53
54
55
56
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
#include <tchar.h>
#include <wchar.h>
#include <locale>
#define BUF_SIZE 256
 
 
int _tmain(int argc, TCHAR* argv[])
{
     PROCESS_INFORMATION pi;
     CHAR buffer[BUF_SIZE];
     setlocale(LC_ALL, "");
     HANDLE handleFile;
 
     //открытие файла
     handleFile=CreateFile(argv[2],GENERIC_READ,0,0,OPEN_EXISTING,0,0);
     if(handleFile==INVALID_HANDLE_VALUE)
     {
         printf("Невозможно открыть файл. Ошибка: %x\n",GetLastError());
         return 1;
     }
     
 
     //создание анонимного канала
     SECURITY_ATTRIBUTES pipeSA ={sizeof(SECURITY_ATTRIBUTES),NULL,TRUE};
     HANDLE hReadPipe, hWritePipe;
     if (!CreatePipe(&hReadPipe,&hWritePipe,&pipeSA,0))
     {
         printf("Невозможно создать канал. Ошибка: %x\n",GetLastError());
         return 1;
     }
 
     DWORD nIn;
//   while(ReadFile(handleFile,hWritePipe,BUF_SIZE,&nIn,0))
    //   continue;
 
 
     //создание дочернего процесса 
     TCHAR * command = L"sort";
     STARTUPINFO si;
     CloseHandle(handleFile);
     //si.hStdInput=hReadPipe;
     if(!CreateProcess(NULL, command,
                NULL,NULL,TRUE,
                CREATE_NEW_CONSOLE,
                NULL,NULL,&si,&pi))
     {
         printf("Невозможно создать процесс. Ошибка:%x\n",GetLastError());
         return 2;
     }
 
     
     system("pause");
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.10.2013, 17:30
Ответы с готовыми решениями:

Передача сообщений через pipe
Прошу помочь с реализацией курсового проекта. Я очень плохо шарю в c++, поэтому ничего не могу понять( Нужно через pipe реализовать...

Передача системного времени через pipe
Всем привет, пишу программу, дочерний процесс должен передать системное время родительскому процессу через pipe, но в чем-то ошибка. Буду...

Передача данных дочернему процессу посредством pipe(): иммитация нажатия enter через терминал
Всем привет. Столкнулся с такой проблемой: есть программа, считывающая логин и пароль (последовательно, сначала логин, после ввода запрос...

32
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.10.2013, 18:19
Цитата Сообщение от EndWar Посмотреть сообщение
прошу помощи разобраться с чтением файла и передачей прочитанных данных через анонимный pipe
Что и куда нужно передавать через pipe ?
0
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
11.10.2013, 18:28  [ТС]
Убежденный, в родительском процессе создается дочерний, в котором выполняется программа принятая в качестве аргумента основной программой (не знаю как более правильно и красиво сказать сказать). так вот через pipe надо передать считанные данные из файла в дочерний процесс, что бы тот, начал их обработку.. как то так
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.10.2013, 18:37
к тому моменту, когда ты пытаешься открыть передающий пайп, принимающий процесс должен уже быть запущен и пайп со своей стороны открыть.
а почему именно анонимный пайп выбран?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.10.2013, 18:40
Цитата Сообщение от EndWar Посмотреть сообщение
так вот через pipe надо передать считанные данные из файла в дочерний процесс, что бы тот, начал их обработку.
Понятно.
Ну тогда Вам стоит для начала почитать про наследование хэндлов из одного процесса в другой:

Handle Inheritance
http://msdn.microsoft.com/en-u... s.85).aspx

Inheritance
http://msdn.microsoft.com/en-u... s.85).aspx

В общем случае, последовательность действий примерно такова - сначала создается
объект с параметром "inherited = true", затем его хэндл прокидывается в создаваемый
процесс, например через командную строку или через STARTUPINFO.

Вот здесь есть пример такого взаимодействия:

Creating a Child Process with Redirected Input and Output
http://msdn.microsoft.com/en-u... s.85).aspx

Когда будете писать, внимательнейшим образом сверяйтесь с документацией,
потому что в работе некоторых функций могут быть малозаметные при беглом чтении,
но очень важные детали. Например, в приведенном выше коде функция CreateProcess
может свалить всю программу в access violation (предлагаю в качестве упражнения
выяснить, почему именно).

Цитата Сообщение от novi4ok Посмотреть сообщение
к тому моменту, когда ты пытаешься открыть передающий пайп, принимающий процесс должен уже быть запущен и пайп со своей стороны открыть.
Не обязательно.
1
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
11.10.2013, 18:48  [ТС]
novi4ok, анонимный выбрал, потому что в именованном нужды нет.. поэтому сделал приоритет пока в него, чтобы разобраться сначала с ним, потом уже с именнованным
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.10.2013, 19:10
Цитата Сообщение от Убежденный Посмотреть сообщение
Не обязательно.
ну да, для анонимных именно так. потому с ними больше мороки. а тс выбрал их "для простоты".
0
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
12.10.2013, 01:22  [ТС]
код набирает объем, а передать через канал данные из файла другому процессу не получается..
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <tchar.h>
#include <locale>
#include <Windows.h>
 
int _tmain(int argc, TCHAR *argv[])
 {
    setlocale(LC_ALL, "");
    LPTSTR szCommand= _tcsdup(TEXT("sort"));
    
    //создание канала
    SECURITY_ATTRIBUTES sa ={sizeof(SECURITY_ATTRIBUTES),NULL,TRUE};
    HANDLE hReadPipe, hWritePipe;
     if (!CreatePipe(&hReadPipe,&hWritePipe,&sa,0))
     {
         printf("Невозможно создать канал. Ошибка: %x\n",GetLastError());
         return 1;
     }
     else
     {
        printf("Канал успешно создан\n");
     }
 
     //создание дочернего процесса 
     STARTUPINFO si;
     PROCESS_INFORMATION pi;
     //si.hStdOutput=;
     ZeroMemory(&si, sizeof(STARTUPINFO)); 
     si.hStdOutput = hWritePipe;
     si.hStdInput=hReadPipe;
     si.cb = sizeof(STARTUPINFO);
     si.dwFlags = STARTF_USESTDHANDLES;
    if(!CreateProcess(0, szCommand, 
        0, 0 ,TRUE, CREATE_NEW_CONSOLE, 0,0,
        &si, &pi))
     {
         printf("Невозможно создать процесс. Ошибка:%x\n",GetLastError());
         return 2;
     }
     else 
     {
         printf("Процесс успешно создан\n");
     }
 
    //открытие файла
     HANDLE handleFile;
     handleFile=CreateFile(argv[2],GENERIC_READ,0,0,OPEN_EXISTING,0,0);
     if(handleFile==INVALID_HANDLE_VALUE)
     {
         printf("Невозможно открыть файл. Ошибка: %x\n",GetLastError());
         return 1;
     }
     else
     {
         printf("Файл успешно открыт\n");
     }
     
    TCHAR * ch=(TCHAR*)malloc(1);
    //перенаправление стандартного ввода команды с файла
    DWORD countFromFile=0;
    DWORD countToPipe=0;
 
    while(ReadFile(handleFile, ch,
        1,
        &countFromFile, 0))
    {
        //запись в 
        WriteFile(hReadPipe,ch,1,&countToPipe,NULL);
    }
     CloseHandle(handleFile);
     CloseHandle(hReadPipe);
 
    //перенаправление результата в стандартный выходной поток
     DWORD countFromPipe=0;
     while(ReadFile(hWritePipe, ch,
        1,
        &countFromPipe, 0))
    {
        printf("%c\n", *ch);
    }
    CloseHandle(hWritePipe);
    system("pause");
}
я правильно понимаю, что можно записать некоторые данные в phRead как в обычный файл? а результат работы, скажем команды sort в дочернем процессе, будет записан в phWrite и, следовательно, можно будет сей результат считать как из обычного файла?
З.Ы. может я неправильно как то понимаю, как можно по-другому перенаправить данные с файла в стандартный ввод дочернего процесса?

Добавлено через 2 часа 40 минут
PS Убежденный, в вашей последней ссылке именно тот код, который мне нужен был.. точнее он работает так, как хотел бы я.. не могли бы вы мне объяснить ситуацию с двумя каналами? почему там используются два канала и почему нельзя было через 1 как нибудь сделать, как пытался сделать я.. ну и на выше стоящие вопросы если бы хоть кто нибудь ответил, было бы неплохо, заранее благодарю)
0
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
14.10.2013, 14:28  [ТС]
как-нибудь можно в ReadFile() заменить буфер на handle, скажем, стандартного вывода? чтобы обойтись без writefile.. если да, то как?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.10.2013, 14:54
Цитата Сообщение от novi4ok Посмотреть сообщение
ну да, для анонимных именно так. потому с ними больше мороки. а тс выбрал их "для простоты".
Нет там никакой "мороки".
Создал пайп, передал хэндл в дочерний процесс и пиши-читай.

Цитата Сообщение от EndWar Посмотреть сообщение
не могли бы вы мне объяснить ситуацию с двумя каналами? почему там используются два канала и почему нельзя было через 1 как нибудь сделать, как пытался сделать я
А комментарии почитать ? Там же все написано прямым текстом.

Цитата Сообщение от EndWar Посмотреть сообщение
как-нибудь можно в ReadFile() заменить буфер на handle, скажем, стандартного вывода? чтобы обойтись без writefile.. если да, то как?
Заменить в ReadFile буфер на HANDLE, чтобы обойтись без WriteFile ?
Это вообще как так ?
0
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
14.10.2013, 16:33  [ТС]
Убежденный, ну собственно сказали, если поиграться с каналами, то в этой программке можно обойтись как то без writeFile.. человек, который мне это сказал, даже сделал подсказку, что рыть надо в сторону _dup2.. но при попытке связать скажем g_hChildStd_OUT_Wr или g_hChildStd_OUT_Rd с HANDLE_STD_OUTPUT программа во время работы вылетает..
какая то путаница у меня пока..
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.10.2013, 16:41
Цитата Сообщение от EndWar Посмотреть сообщение
какая то путаница у меня пока..
Путаница в голове - каша в коде. Почему бы взять да и не почитать что-нибудь о
программировании пайпов, о наследовании хэндлов... Того же А. Побегайло,
например ("Системное программирование в Windows").

И еще. Чего Вы хотите добиться ? Передать команду в дочерний процесс, все-таки,
или "обойтись без WriteFile" ?
0
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
14.10.2013, 17:09  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
И еще. Чего Вы хотите добиться ? Передать команду в дочерний процесс, все-таки,
или "обойтись без WriteFile" ?
первой поставленной цели я добился. не без помощи конечно приведенного вами кода на msdn, за что благодарен вам. теперь цель - немного модифицировать каналы, чтобы можно было обойтись без writefile..
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.10.2013, 17:50
Цитата Сообщение от EndWar Посмотреть сообщение
теперь цель - немного модифицировать каналы, чтобы можно было обойтись без writefile..
Обойтись без WriteFile где ? В каком месте ?
0
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
14.10.2013, 19:24  [ТС]
Убежденный,
Кликните здесь для просмотра всего текста
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <tchar.h>
#include <locale>
#include <Windows.h>
#include <io.h>
 
int _tmain(int argc, TCHAR *argv[])
{
    setlocale(LC_ALL, "");
    LPTSTR szCommand= _tcsdup(TEXT("sort"));
    TCHAR * path=L"text.txt";
 
 
    //открытие файла
     HANDLE handleFile;
     
     handleFile=CreateFile(path,GENERIC_READ,0,NULL,
                            OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
     
     if(handleFile==INVALID_HANDLE_VALUE)
     {
         printf("Невозможно открыть файл. Ошибка: %x\n",GetLastError());
         return 1;
     }
     else
     {
         printf("Файл успешно открыт\n");
     }
 
    //создание канала
    SECURITY_ATTRIBUTES sa ={sizeof(SECURITY_ATTRIBUTES),NULL,TRUE};
    HANDLE hReadInPipe, hWriteInPipe,hReadOutPipe,hWriteOutPipe;
    if (!CreatePipe(&hReadOutPipe,&hWriteOutPipe,&sa,0))
     {
         printf("Невозможно создать канал. Ошибка: %x\n",GetLastError());
         return 1;
     }
     else
     {
        printf("Канал успешно создан\n");
     }
 
     if (! SetHandleInformation(hReadOutPipe,HANDLE_FLAG_INHERIT,0))
     {
         printf ("Ошибка перенаправления вывода\n");
         return 1;
     }
 
     //----------------
     if (!CreatePipe(&hReadInPipe,&hWriteInPipe,&sa,0))
     {
         printf("Невозможно создать канал. Ошибка: %x\n",GetLastError());
         return 1;
     }
     else
     {
        printf("Канал успешно создан\n");
     }
     
     if (! SetHandleInformation(hWriteInPipe,HANDLE_FLAG_INHERIT,0))
     {
         printf ("Ошибка перенаправления вывода\n");
         return 1;
     }
     
 
     //создание дочернего процесса 
     STARTUPINFO si;
     PROCESS_INFORMATION pi;
     ZeroMemory(&si, sizeof(STARTUPINFO)); 
     si.hStdOutput = hWriteOutPipe;
     si.hStdInput=hReadInPipe;
     si.cb = sizeof(STARTUPINFO);
     si.dwFlags = STARTF_USESTDHANDLES;
 
     if(!CreateProcess(0, szCommand, 
        0, 0 ,TRUE, CREATE_NEW_CONSOLE, 0,0,
        &si, &pi))
     {
         printf("Невозможно создать процесс. Ошибка:%x\n",GetLastError());
         return 2;
     }
     else 
     {
         printf("Процесс успешно создан\n");
         CloseHandle(pi.hProcess);
         CloseHandle(pi.hThread);
     }
 
     
    TCHAR * ch=(TCHAR*)malloc(1);
    //перенаправление стандартного ввода команды с файла
    DWORD dwRead,dwWritten;
    CHAR chBuf[4096];
    
    BOOL bSuccess=FALSE;
    for (;;)
    {
        bSuccess=ReadFile(handleFile,hWriteInPipe,1,&dwRead,NULL);
        if (!bSuccess || dwRead==0) break;
 
        //bSuccess=WriteFile(hWriteInPipe,chBuf,dwRead,&dwWritten,NULL);
        //if (!bSuccess) break;
    }
    if (!CloseHandle(hWriteInPipe))
    {
        printf("Ошибка закрытия канала\n");
        return 3;
    }
    CloseHandle(hWriteOutPipe);
    CloseHandle(hReadInPipe);
    CloseHandle(handleFile);
    
    //перенаправление результата в стандартный выходной поток
    DWORD _dwRead,_dwWritten;
    CHAR _chBuf[4096];
    BOOL _bSuccess = FALSE;
    HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   for (;;) 
   { 
       _bSuccess = ReadFile( hReadOutPipe, stdout, 1, &_dwRead, NULL);
      if( ! _bSuccess || _dwRead == 0 ) break; 
 
      _bSuccess = WriteFile(hParentStdOut, chBuf, 
                          _dwRead, &_dwWritten, NULL);
      if (! _bSuccess ) break; 
   } 
   CloseHandle(hReadOutPipe);
   system("pause");
}


вот пока тот код, что у меня есть и работает.. в нем всего два раза используется WriteFile.. Первый раз когда мы записываем в канал отправляющий данные дочернему процессу, второй раз когда принимаем в родительский процесс обратно результат.. вот эти оба writefile надо как то избежать, используя _dup2 и перенаправление потоков ввода/вывода
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.10.2013, 08:59
Цитата Сообщение от EndWar Посмотреть сообщение
вот пока тот код, что у меня есть и работает.. в нем всего два раза используется WriteFile.. Первый раз когда мы записываем в канал отправляющий данные дочернему процессу, второй раз когда принимаем в родительский процесс обратно результат.. вот эти оба writefile надо как то избежать, используя _dup2 и перенаправление потоков ввода/вывода
Pipe - это дуплексный канал. Сообщения могут передаваться в оба конца.

Пример из MSDN использует два пайпа, потому что работает с однонаправленными
стандартными потоками (stdin и stdout) и их редиректом. То есть, он пишет
через stdin в дочерний процесс, а читает из него через stdout, причем дочерний
процесс никакой подмены "не видит" и по-прежнему использует std::cin/std::cout.

Но ничто не мешает создать пайп, передать его хэндл в дочерний процесс, а затем
писать и читать в пайп, используя оба конца. Однако в любом случае I/O-операций
будет, как минимум, две: передача данных дочернему процессу и прием ответа от него.
1
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
15.10.2013, 22:21  [ТС]
Убежденный, эта теория вся прекрасна, конечно.. но я хотел бы знать еще как работать с _dup2? у него прототип int _dup2(int,int).. передать HANDLE в качестве аргумента, как я понимаю, не получится.. при явном приведении происходит краш программы
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.10.2013, 23:50
DuplicateHandle(Ex).
0
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
16.10.2013, 12:59  [ТС]
а как это должно помочь? мне надо как то привести дескриптор handle к типу int.. а эта функция, насколько я знаю, просто копирует одному handle другой дескриптор со всеми его свойствами.. в результате остается все тот же handle..
З.Ы. видел образец программы на UNIX. и я теперь уверен, что дело осталось за малым.. просто понять как использовать _dup2(int,int).. на msdn не нашел примера использования совместно с HANDLE
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
16.10.2013, 13:35
_dup2 работает с файловыми дескрипторами стандартной библиотеки C/C++.
А DuplicateHandle(Ex) - с HANDLE из Win32 API, это немного разные вещи (хотя
сводится все в конечном счете к HANDLE).

Но Вы можете более четко описать, чего именно требуется достичь с помощью пайпов ?
Передача данных туда-сюда, как видим, работает, чего же не хватает ?
Для чего нужно избавляться от WriteFile ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.10.2013, 13:35
Помогаю со студенческими работами здесь

Интегрирование полинома, считанного из файла
Из файла считывается степень полинома и его коэффициенты. Например, ============== 5 1 2 3 4 5 6 ============== ~ 1 + 2*x + 3*x^2...

Заполнить массив цифрами числа, считанного через cin
Здрасти, как ввести в массив int mMass число 12345 с помощью cin&gt;&gt;? Нужно чтобы в mMass записалась 1, в mMass записалась 2 .... и...

Обработка массива, считанного из файла; найти ошибку
Есть задание: программа считывает из файла массив целых чисел. Найти максимум (max) и минимум (min) среди них, после чего найти среднее...

Передача данных между процессами (pipe)
Всем доброго времени суток. Обращаюсь к вам с вопросиком. Передо мной стоит задача написать код, который: 1. Создавай процесс 2....

Передача данных между консолью с использованием Pipe
Добрый день! Не получается организовать передачу данных между двумя консольными приложениями при использовании буфера с типом wchar_t....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru