Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30

Аналог CreateProcess()

18.04.2018, 11:40. Показов 8573. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ли в Linux полноценный аналог виндовой CreateProcess().
Я искал, есть разные ф-ции для работы с подпроцессами, но все они как-то предоставляют только те или иные возможности.
Хотелось бы получать id, работать с перенаправлением вывода - пайпами, возможности ждать завершения процесса, возможности убить процесс итп.

Что наиболее близко к по ф-ционалу CreateProcess() ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.04.2018, 11:40
Ответы с готовыми решениями:

CreateProcess с совместимостью Win95 (програмно)
Странный, возможно кому-то покажется что даже идиотский вопрос: как програмно установить параметрами запуска процесса совместимость с...

кроссплатформенный аналог WinApi функций (CreateProcess)
Всем привет! Есть ли готовое решение для вызова исполняемого файла(в WinAPI это CreateProcess) в разных OS? Добавлено через 15 часов...

CreateProcess()
Доброго времени суток! Делаю лабу по Операционным системам, и столкнулся с некоторыми трудностями. Вот часть задания: Разработать и...

49
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.04.2018, 15:02  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Чем приведенный пример не устраивает? Нет показано как вызывать pipe()? А маны на что? Гугл на что?
Да не показано как работать с выводом.
Ну дайте ссылку на ман где это показано.

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И в третий раз советую почитать про каналы (pipes).
Лучше покажите как пайп связать порожденным процессом по его pid-у
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
22.04.2018, 17:51
Цитата Сообщение от Avazart Посмотреть сообщение
Лучше покажите как пайп связать порожденным процессом по его pid-у
С уже порожденным возможно что никак. Хотя reptyr что-то подобное умеет, можете в его исходниках покопаться.
Цитата Сообщение от Avazart Посмотреть сообщение
Ну дайте ссылку на ман где это показано.
И четвертый раз скажу. В моем примере уже реализовано перенаправление stdout в файл. При помощи pipe() создаете канал и перенаправляете вывод туда вместо файла.
Вместо того чтобы кидаться дурацкими обвинениями и пытаться развести "на слабо" показывайте свой прогресс.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.04.2018, 18:15  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
С уже порожденным возможно что никак. Хотя reptyr что-то подобное умеет, можете в его исходниках покопаться.
Я имел наш дочерний процесс.

Добавлено через 49 секунд
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В моем примере уже реализовано перенаправление stdout в файл
stdout дочернего процесса? или весь stdout(родительский) ?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
22.04.2018, 22:37
Цитата Сообщение от Avazart Посмотреть сообщение
stdout дочернего процесса? или весь stdout(родительский) ?
А в каком процессе, родительском или дочернем, идет клонирование дескриптора файла вывода?
Повторяю: я не собираюсь давать готовое решение. Учитесь наконец пользоваться документацией. Линуксовая документация это вам не msdn, там все просто. Команды документированы (и эта документация вшита в систему!), оперируют парой аргументов и отвечают только за то что им надо. В отличие от ужаса из msdn где у каждой команды десяток аргументов без вменяемых пояснений о назначении.
Почитайте ман на pipe. Для чего используется, что принимает и что возвращает. Почитайте ман на fork: что происходит с дескрипторами открытых файлов. После этого покажите свое понимание как это должно работать.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.04.2018, 23:09  [ТС]
Я задал довольно конкретный вопрос Вы же мне гоните порожняк, а потом удивляетесь.
К чему спрашивается?

Я понимаю когда человек спрашивает что неконкретное и его гонят в гугл и в доку.
Но вопрос вполне конкретен и однозначен. Не знает лучше промолчите.

Добавлено через 3 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А в каком процессе, родительском или дочернем, идет клонирование дескриптора файла вывода?
Объясняю проще, если не доходит.
Допусти у меня есть моя программы мне из нее нужно вызвать какую нибудь стандартную утилиту туже ls или ping
при чем не засерая в своей программе вывод и не задействуя файлов и прочих костылей. Но к примеру нужно вывести проанализированный вывод к примеру список файлов без всего лишнего или результат пинга.

Добавлено через 9 минут
Под виндой я делаю это приблизительно так:

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
STARTUPINFO startupInfo_;
PROCESS_INFORMATION processInfo_;
SECURITY_ATTRIBUTES security_;
 
// ...
 
ZeroMemory(&startupInfo_, sizeof(startupInfo_));
startupInfo_.cb= sizeof(startupInfo_);
startupInfo_.wShowWindow= SW_NORMAL;
startupInfo_.dwFlags= STARTF_USESHOWWINDOW;
 
startupInfo_.dwFlags |= STARTF_USESTDHANDLES;
/* Указываю в структуре ранее созданные два пайпа (там в реальном  коде мои ООП обвертки для пайпов*/
startupInfo_.hStdOutput= stdOut_.client.handle();
startupInfo_.hStdError=  stdOut_.client.handle();
startupInfo_.hStdInput= stdIn_.client.handle();
 
/* Передаю структуру в CreateProcess*/
 
  started_=
    CreateProcess( appName_.empty()? 0 : appName_.c_str(), // _In_opt_ LPCTSTR lpApplicationName,
                   cmdLine_.empty()? 0 : const_cast<tchar*>(cmdLine_.c_str()), // _Inout_opt_ LPTSTR lpCommandLine,
                   &security_,        // _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
                   &security_,        // _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
                   inheritHandle_,    // _In_  BOOL  bInheritHandles,
                   creationFlags_|priority_,    //  _In_ DWORD dwCreationFlags,
                   envStr.empty()? 0 : (LPVOID)envStr.c_str(), // _In_opt_ LPVOID lpEnvironment,
                   currentDir_.empty()? 0: currentDir_.c_str(),// _In_opt_ LPCTSTR lpCurrentDirectory,
                   &startupInfo_, // _In_  LPSTARTUPINFO lpStartupInfo,
                   &processInfo_); //  _Out_ LPPROCESS_INFORMATION lpProcessInformation
А затем просто общаюсь с дочерним процессом через эти два пайпа через ReadFile(), WriteFile()

Не по теме:

Полный код тут https://github.com/Avazart/Bic... rocess.cpp

0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
23.04.2018, 00:13
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Под виндой я делаю это приблизительно так:
под *nix для переназначения дескрипторов используется dup2
Алгоритм примерно следующий:
В родителе:
  • Перед fork создается нужное количество pipe
  • Делается fork(при этом как у родителя так и у ребенка остается связь через пайпы)
В ребенке:
  • После fork и перед exec с помощью dup2 переназначаются stdin и stdout
  • вызов exec* - у вызванной программы stdin и stdout назначены на указанные пайпы.
первый попавшийся в гугле пример pipe fork dup2 exec
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
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
 
#define PIPE_READ 0
#define PIPE_WRITE 1
 
int createChild(const char* szCommand, char* const aArguments[], char* const aEnvironment[], const char* szMessage) {
  int aStdinPipe[2];
  int aStdoutPipe[2];
  int nChild;
  char nChar;
  int nResult;
 
  if (pipe(aStdinPipe) < 0) {
    perror("allocating pipe for child input redirect");
    return -1;
  }
  if (pipe(aStdoutPipe) < 0) {
    close(aStdinPipe[PIPE_READ]);
    close(aStdinPipe[PIPE_WRITE]);
    perror("allocating pipe for child output redirect");
    return -1;
  }
 
  nChild = fork();
  if (0 == nChild) {
    // child continues here
 
    // redirect stdin
    if (dup2(aStdinPipe[PIPE_READ], STDIN_FILENO) == -1) {
      exit(errno);
    }
 
    // redirect stdout
    if (dup2(aStdoutPipe[PIPE_WRITE], STDOUT_FILENO) == -1) {
      exit(errno);
    }
 
    // redirect stderr
    if (dup2(aStdoutPipe[PIPE_WRITE], STDERR_FILENO) == -1) {
      exit(errno);
    }
 
    // all these are for use by parent only
    close(aStdinPipe[PIPE_READ]);
    close(aStdinPipe[PIPE_WRITE]);
    close(aStdoutPipe[PIPE_READ]);
    close(aStdoutPipe[PIPE_WRITE]); 
 
    // run child process image
    // replace this with any exec* function find easier to use ("man exec")
    nResult = execve(szCommand, aArguments, aEnvironment);
 
    // if we get here at all, an error occurred, but we are in the child
    // process, so just exit
    exit(nResult);
  } else if (nChild > 0) {
    // parent continues here
 
    // close unused file descriptors, these are for child only
    close(aStdinPipe[PIPE_READ]);
    close(aStdoutPipe[PIPE_WRITE]); 
 
    // Include error check here
    if (NULL != szMessage) {
      write(aStdinPipe[PIPE_WRITE], szMessage, strlen(szMessage));
    }
 
    // Just a char by char read here, you can change it accordingly
    while (read(aStdoutPipe[PIPE_READ], &nChar, 1) == 1) {
      write(STDOUT_FILENO, &nChar, 1);
    }
 
    // done with these in this example program, you would normally keep these
    // open of course as long as you want to talk to the child
    close(aStdinPipe[PIPE_WRITE]);
    close(aStdoutPipe[PIPE_READ]);
  } else {
    // failed to create child
    close(aStdinPipe[PIPE_READ]);
    close(aStdinPipe[PIPE_WRITE]);
    close(aStdoutPipe[PIPE_READ]);
    close(aStdoutPipe[PIPE_WRITE]);
  }
  return nChild;
}
1
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
23.04.2018, 07:24
Цитата Сообщение от Avazart Посмотреть сообщение
Я задал довольно конкретный вопрос Вы же мне гоните порожняк, а потом удивляетесь.
К чему спрашивается?
Если ты не способен понять ответ на свой вопрос, стоит все-таки ознакомиться с теорией.
Цитата Сообщение от Avazart Посмотреть сообщение
Объясняю проще, если не доходит.
Объясняю проще если не доходит: я за тебя писать код не собираюсь. Напишешь свою версию можно будет говорить.
Цитата Сообщение от Avazart Посмотреть сообщение
Под виндой я делаю это приблизительно так:
То есть функция с 10 странными параметрами это просто, а пара функций с 0-2 параметрами ну вот совсем недоступны для понимания.

Не по теме:

Цитата Сообщение от Max Dark Посмотреть сообщение
первый попавшийся в гугле пример pipe fork dup2 exec
Жаль что поддерживаете халявщиков

0
23.04.2018, 08:43

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Жаль что поддерживаете халявщиков
Груз опыта работы с API одной системы иногда мешает понять, что в других OS все совсем по другому.

0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
23.04.2018, 10:06
Поэтому надо читать документацию, читать код авторов этой ОС, а не побираться на форумах. Да еще с таким видом как будто ему должны. Вы же сами по первым ссылкам в гугле нашли готовый пример, что мешало ТСу сделать тоже самое?
.
А так у меня была полностью симметричная ситуация. Пытался найти как через winapi настроить неблокирующие каналы (non-blocking pipes), чтобы если канал переполнился, программа не ждала его очистки, а сама решала что делать. Пару недель бился лбом в стену msdn'а и гугла, _потом_ спросил на форуме (за что какие-то неадекватные личности решили заминусовать). В конце концов плюнул и решил задачу через... ну, другим способом, в общем. А нормального решения так и нет. Не понимаю, виндузятники вообще неблокирующими каналами не пользуются что ли?
Это к тому что даже для чужой операционки сначала поискать решение самому... или выяснить что задача какая-то нетипичная и стоит переформулировать подход.
0
 Аватар для Старый воин
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
23.04.2018, 15:11
COKPOWEHEU,
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
сначала поискать решение самому
Самый правильный подход...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.04.2018, 15:54  [ТС]
Цитата Сообщение от Max Dark Посмотреть сообщение
Алгоритм примерно следующий:
Понятно, но все же вероятно можно проще и более похоже на CreateProcess()
http://man7.org/linux/man-page... awn.3.html

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Объясняю проще если не доходит: я за тебя писать код не собираюсь.
Какой код? Я говорил написать ? Я просил подсказать ф-цию (а в данном случае оказалось комбинацию ф-ций) и как их использовать что бы обеспечить необходимое.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Пытался найти как через winapi настроить неблокирующие каналы
Забавная тема, про как Вы "халявите" и не читаете MSDN кроме того ведете себя как ... а потом жалуетесь что никто не помог.

Я как то тоже задавал тему по пайпам в этом разделе и Убежденный мне вполне помог.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
23.04.2018, 16:21
Цитата Сообщение от Avazart Посмотреть сообщение
Какой код? Я говорил написать ? Я просил подсказать ф-цию (а в данном случае оказалось комбинацию ф-ций) и как их использовать что бы обеспечить необходимое.
И их уже неоднократно назвали: pipe(), fork(), dup(),exec(). Достаточно было почитать документацию на них чтобы понять:
pipe(fd) создает канал, причем на запись открывается файловый дескриптор fd[1], а на чтение - fd[0]
fork() клонирует процесс, оставляя все файловые дескрипторы на своих местах, то есть открытые предыдущей командой fd[0] в родителе на чтение, fd[1] на запись, плюс fd[0] в потомке на чтение и fd[1] на запись.
dup2(oldfd, newfd) добавляет открытому файлу новый дескриптор. В моем примере в качестве второго выступает stdout, а в качестве первого - открытый файл. Но никто не мешает вместо обычного файла подложить канал: dup(fd[1], STDOUT_FILENO);
Потом закрываем все лишние дескрипторы: close(fd[1]); в родителе и close(fd[0]); close(fd[1]); в потомке.
exec() подменяет вызывающий процесс на то что ему передано, не трогая открытых дескрипторов.
ВСЕ! Вот весь код:
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
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
 
int main(){
  pid_t pid;
  int fd[2];
  pipe(fd);
  pid = fork();
  if(pid == 0){
    printf("Forked!\n");
    dup2(fd[1], STDOUT_FILENO);
    close(fd[0]); close(fd[1]);
    execl("/bin/ls", "ls", "./", NULL); //вызовем какую-нибудь стандартную утилиту
    return -2;
  }else if(pid < 0){
    fprintf(stderr, "Some error on fork\n");
    return -1;
  }
  close(fd[1]);
  char str[100]; //добавим демонстрационный вывод
  wait(NULL);
  read(fd[0], str, 100);
  printf("Read: %s\n");
  close(fd[0]);
}
Цитата Сообщение от Avazart Посмотреть сообщение
Забавная тема, про как Вы "халявите" и не читаете MSDN
Угу. Приводить собственные попытки решения в соответствии с документацией (msdn), описывать встреченные грабли это уже называется халявить.

Не по теме:

В то же время отсутствие вообще хоть какого-то кода, хотя бы попыток решения в этой теме это норма


Цитата Сообщение от Avazart Посмотреть сообщение
кроме того ведете себя как ... а потом жалуетесь что никто не помог.
Конечно, когда дают капитанские советы, про которые в первом же посте было написано что не сработали. Я не сомневаюсь, что в работе с каналами есть какие-то неочевидные тонкости (не описанные в msdn) - вместо того чтобы направить в нужную сторону мне высокомерно кидают ссылку на тот же msdn. О да, верх помощи!
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.04.2018, 16:29  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И их уже неоднократно назвали: pipe(), fork(), dup(),exec().
Вопрос был в том как это связать, мне именно это не было понятно.

Добавлено через 3 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Конечно, когда дают капитанские советы, про которые в первом же посте было написано что не сработали.
Вам дали четкие советы и даже процитировали MSDN.
"Не сработали" по тому что руки кривые, я всегда так говорю когда человек не показывает что делает, как исправил и что именно не сработало, никто не может телепатически угадать что Вы на гавнокодили что не работает.

По тому коду который Вы выложили можно сказать что это именно так. Не приперались бы Вам бы указали конкретно в каких строчках кода ошибки и что не так.

Добавлено через 2 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
вместо того чтобы направить в нужную сторону мне высокомерно кидают ссылку на тот же msdn. О да, верх помощи!
А мне что ответили:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
pipe(), fork(), dup(),exec().
даже ссылку не кинули... не повод вести себя как ...
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
23.04.2018, 18:22
Цитата Сообщение от Avazart Посмотреть сообщение
Вопрос был в том как это связать, мне именно это не было понятно.
А их можно было связать как-то по-другому? Эти функции друг с другом не пересекаются, каждая отвечает за свою задачу.
Цитата Сообщение от Avazart Посмотреть сообщение
Вам дали четкие советы и даже процитировали MSDN.
Ложь. Советов, тем более четких, не было. Ссылка на MSDN, тем более прочитанная ранее, советом не является. Указание "в коде что-то не так" тоже.
Цитата Сообщение от Avazart Посмотреть сообщение
даже ссылку не кинули... не повод вести себя как ...
Ссылку на что? На ман, который и так установлен в системе? Названия функций были даны, неужели так сложно самостоятельно ввести man fork man exec man dup man pipe ?
Повторяю: эти функции достаточно просты и независимы, в них нет десятка невнятных параметров. 80% кода было приведено мной ранее и дана подсказка вместо обычного файла подсовывать функции dup2() выхлоп функции pipe(). Я просто не представляю, как еще понятнее можно было подсказать, не приводя готового кода.
Кроме того, в отличие от вас я привел свой вариант кода и попытки решения.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.04.2018, 18:43  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ложь. Советов, тем более четких, не было. Ссылка на MSDN, тем более прочитанная ранее, советом не является. Указание "в коде что-то не так" тоже.
Цитата Сообщение от Убежденный Посмотреть сообщение
У тебя оба конца пайпа открываются с флагом FILE_FLAG_OVERLAPPED, что подразумевает
асинхронный ввод-вывод. Но при этом в функциях mppipe_read и mppipe_write чтение и
запись делаются в синхронной манере, без использования структуры OVERLAPPED и
даже без проверки значений, которые возвращаются функциями ReadFile/WriteFile.
Также нет проверок ни в PeekNamedPipe, ни в ConnectNamedPipe. Ничего удивительного,
что в итоге программа работает не так, как ожидалось.
Ну и ложь или проблемы зрения и памяти?

Кроме того если MSDN не помогает можно почитать книги, Убежденный Вам указал какую. Так же поискать в это книге Рихтера.

Более того в Ваше коде который Вы выложили после так и не появилось проверок, а структура OVERLAPPED используется неправильно.

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ссылку на что? На ман,
Почему нет, я же нашел
http://man7.org/linux/man-page... awn.3.html

чем не ссылка?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
23.04.2018, 20:33
Цитата Сообщение от Avazart Посмотреть сообщение
У
тебя оба конца пайпа открываются с флагом FILE_FLAG_OVERLAPPED, что подразумевает
асинхронный ввод-вывод. Но при этом в функциях mppipe_read и mppipe_write чтение и
запись делаются в синхронной манере, без использования структуры OVERLAPPED и
даже без проверки значений, которые возвращаются функциями ReadFile/WriteFile.
Также нет проверок ни в PeekNamedPipe, ни в ConnectNamedPipe. Ничего удивительного,
что в итоге программа работает не так, как ожидалось.
Ну и ложь или проблемы зрения и памяти?
То есть вот это по-вашему "четкие советы по исправлению"? То что моя версия работает неправильно я и сам знаю, иначе бы не заводил тему.
Цитата Сообщение от Avazart Посмотреть сообщение
Более того в Ваше коде который Вы выложили после так и не появилось проверок, а структура OVERLAPPED используется неправильно.
Ясно. Даже первые пару постов вы не осилили. А ведь там было написано что я проверял кучу различных комбинаций, но ни одна не дала результата лучше, чем выложенная. Хранить все неудачные эксперименты я не собираюсь. И опять же: то что там используется неправильно я и сам знаю. Но вот почему-то, "как правильно" предложили только под конец товарищем Ygg. Причем не работает в wine и winXP (в более старых наверняка тоже), то есть тоже не решение.
Повторюсь: пусть и через задницу, но задача была решена еще в 6 посте, и с тех пор ничего лучше найдено не было.
Цитата Сообщение от Avazart Посмотреть сообщение
Почему нет, я же нашел
Не самая распространенная команда, fork + exec как-то более известны. Что-то мне подсказывает, что posix_spawn как раз вызывает fork, exec и прочие функции, то есть вы просто нашли другую запись того же самого решения. В принципе, тоже неплохо.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.04.2018, 20:42  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А ведь там было написано что я проверял кучу различных комбинаций, но ни одна не дала результата лучше, чем выложенная.
Да потому все реализации делали одни и те же руки кривые, так точнее?
Если Вы не поняли то что Вам сказали, то уж...

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

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Причем не работает в wine и winXP (в более старых наверняка тоже), то есть тоже не решение.
Ну это полный писец.
wine - это к все претензии разработчикам wine
winXP - давно на помойке.

Добавлено через 5 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не самая распространенная команда, fork + exec как-то более известны.
Ну под виндой тоже когда полный ноль многое не известно.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
23.04.2018, 21:45
Цитата Сообщение от Avazart Посмотреть сообщение
Да потому все реализации делали одни и те же руки кривые, так точнее?
Так откуда ж другие взять? Ну и раз линуксовая версия заработала, раз удалось обойти ограничение, значит не такие уж кривые.
Цитата Сообщение от Avazart Посмотреть сообщение
Почему я так говорю про кривые руки, да потому что нормальный программист думает делает, анализирует результат - а не перебирает комбинации в надежде оно чудесным образом заработает.
Это когда информации достаточно. Очевидно это не тот случай.
Цитата Сообщение от Avazart Посмотреть сообщение
Ну это полный писец.
wine - это к все претензии разработчикам wine
winXP - давно на помойке.
Та задача - малая часть общей программы. Не буду же я каждый раз для тестирования перезагружать систему! А wine достаточно хорошо эмулирует winapi чтобы после него тестировать только ключевые сборки. А если даже у разработчиков wine возникают проблемы с реализацией этих функций то с ними явно что-то не так.
Ну и отсутствие совместимости между версиями windows удручает.
Цитата Сообщение от Avazart Посмотреть сообщение
Ну под виндой тоже когда полный ноль многое не известно.
Не так. Тут оба решения рабочие - и через pipe + fork + dup + exec, и через posix_spawn, а там ни одно.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.04.2018, 22:38  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Так откуда ж другие взять?
На мясофабрике )))
Очевидно что если у других работает, а у Вас нет ...

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это когда информации достаточно. Очевидно это не тот случай.
Вполне достаточно, Вам все расжевали, еще и литературу указали.
Я же могу поспорить что книгу не читали.

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
wine достаточно хорошо эмулирует winapi чтобы после него тестировать только ключевые сборки.
Вероятно не так хорошо как Вы думали.
Но вообще это предсказуемо. Эмулятор есть эмулятор, тестировать нужно на реальной машине и на поддерживаемой системе.

Добавлено через 37 секунд
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ну и отсутствие совместимости между версиями windows удручает.
Это говорит линуксод ? Где в некоторых дистрибутивах релизы выходят чуть ли не каждый месяц.

Добавлено через 8 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ну и отсутствие совместимости между версиями windows удручает.
Кстати не исключено что под XP не работает тоже из-за кривизны рук.
Вам ранее говорили обрабатывать ошибки, Вы этого не делали.
Обычно WinApi ф-ции возвращают определенный результат, в случае возникновения обычно ошибки стоит вызывать GetLastError() которая даст нам код ошибки, и затем код подставить FormatMessage() что бы получить текстовое описание ошибки.
Так вот если делалось правильно Вы бы знали конкретно в чем причина. Я подозреваю что какая то трабла с путем/именем канала.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
24.04.2018, 07:30
Цитата Сообщение от Avazart Посмотреть сообщение
Очевидно что если у других работает, а у Вас нет ...
Вообще-то очевидно обратное - что ни у кого не работает.
Цитата Сообщение от Avazart Посмотреть сообщение
Вполне достаточно
Мне начинает надоедать опровергать явную чушь. Было бы достаточно наткнулся бы в гугле сразу. Впрочем, вместо работы языком предлагаю поработать головой. Если там такая куча информации, примеров и прочего - напишите свою реализацию. Если опасаетесь от меня ваших приемов взятия "на слабо", сойдет и экзешник. Без этого ваши высказывания ничуть не ценнее пустословия Убежденного.
Цитата Сообщение от Avazart Посмотреть сообщение
Вероятно не так хорошо как Вы думали.
Угу. Разнообразные игры идут, системы разработки, сотни прочих программ идут без особых глюков. Разработчики воспроизвели управление окнами, звуком и DirectX. А вот стандартные виндовые функции не осилили.
Цитата Сообщение от Avazart Посмотреть сообщение
Это говорит линуксод ? Где в некоторых дистрибутивах релизы выходят чуть ли не каждый месяц.
Обновление != поломка совместимости. Обновление != необходимость менять железо. Ну и поддержка всех используемых программ и допилка под обновленные системы.
Отсюда вывод: на большинство компьютеров можно безболезненно поставить последнюю версию системы. Если не использовать особенности, реализованные в более поздних версиях, то проблем не возникает (разницу с winxp vs win7 сами видите: формально эти функции есть и там и там, по факту работает только в win7). Даже если проблема возникает, есть достаточно документации (опять же в отличие от winapi) чтобы это исправить.
Или есть конкретный пример травмы детства?
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати не исключено что под XP не работает тоже из-за кривизны рук.
Бла-бла-бла. Что там на счет показать свою версию?
.
В общем, пока не продемонстрируете что это у меня руки кривые и в документации было явно написано как это сделать. Ну примерно как с моим примером по pipe + fork + dup + exec. Вот тогда и приходите.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2018, 07:30
Помогаю со студенческими работами здесь

CreateProcess
Доброго времени суток. Студия 15. Виндовс форм. Создается процесс &quot;CreateProcess&quot;. Все запускается, все работает. Но не могу вынести...

CreateProcess
Помогите запустить программу вывода дерева каталогов через CreateProcess CreateProcess: #include &lt;windows.h&gt; #include...

CreateProcess
Такая трабла - человечек попросил сделать лабу - там процессы . начал искать решение - нашел вполне понятную функцию fork... но только она...

CreateProcess
Здравствуйте! Как запустить страницу в браузере через CreateProcess? Вот так CreateProcess(ExeFile.c_str(),sPar.c_str(), NULL, NULL,...

CreateProcess
У меня несколько вопросов по CreateProcess 1) как с помощью CreateProcess перенаправить ввод/вывод программы? 2) как узнать какой код...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru