| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > CreateProcess |
| Автор: oleg1973 5.1.2005, 22:59 |
| и так возник у меня вопрос есть аналог CreateProcess или нет? всякие fork execve .... не то к примеру запустить /bin/calc.exe как мне ? |
| Автор: dargaard 6.1.2005, 09:23 |
| А чем тебе fork()+execve() не подходят в данном случае? |
| Автор: Guest 6.1.2005, 16:55 |
| в win32 CreateProcess - API OS fork - системный вызов POSIX так что нужно отбросить неприязнь к fork |
| Автор: oleg1973 6.1.2005, 17:00 |
| я понял так после маночитания fork - создает копию процесса который его вызвал execv - замешает процесс который его вызвал на процесс указаный там в аргументах тоесть ты как я понял предлогаещ делать сначала форк а потом ехес както не по програмерски а одной функ никак нельзя? |
| Автор: Sun 6.1.2005, 17:06 |
| Можно через int system(const char *string); |
| Автор: oleg1973 6.1.2005, 17:11 |
| Guest причем тут неприязнь? Sun ну так ето к syscalls не относится так понимаю |
| Автор: dargaard 6.1.2005, 17:15 | ||
Разве что как Sun сказал system-ом, но я уверен что внутри все равно происходит fork+exec. Вообше у нас все процессы так создаются - создается копия процесса и после этого код новой проги загружается в память копии. Добавлено @ 17:17 Все процессы на системе происходят от init процесса, т.е. init является родителем всех - если умирает init - умирают и все процессы |
| Автор: oleg1973 6.1.2005, 17:29 |
| а как процессу понять кто он? копия или оригинал? а то так и будет запускатся до безконечности |
| Автор: dargaard 6.1.2005, 17:31 |
| oleg1973 Что будет запускаться до бесконечности? if (fork()==0) { //ребенок //делаем execve(...) - процесс перетирается //тут проверяем return код ехecve - ф-ция вернется только в том случае если процесс //по какой то причине не смог перетереться - в противном случае мы даже не доидем до этой //строчки } else { //родитель } |
| Автор: oleg1973 6.1.2005, 17:37 | ||
| ааа вот оно как все понял и родил
Добавлено @ 17:39 хотя конешно вы господа люниксоиды и извращенцы не могли createprocess придумать |
| Автор: dargaard 6.1.2005, 17:40 |
| з.ы. Если надо дождаться пока новый процесс не выполнится то в родителе изпользуем wait() или waitpid(). pid = fork(); if (pid==0) { execv (...); printf("Error occured\n"); exit(0); } else { printf("Child is %d - ждемс пока не выполнится\n",pid); waitpid(pid,0, флаги); } |
| Автор: oleg1973 6.1.2005, 17:43 |
| так а если я запускаю некий файл как мне прочитать его оутпут? и передать sys_write sys_read |
| Автор: dargaard 6.1.2005, 17:52 |
| oleg1973 так сразу и не напишу - надо посидеть чуток. почитай ман по dup() и dup2() - если мне не изменяет память то с помошью этих ф-ций можно перенаправить output вызываемой проги куда нить еше. Можешь еше man pipe почитать С работы покопаюсь в исходниках своего шела посмотрю как там pipe сделан - но помню что с dup() и pipe() |
| Автор: Sun 6.1.2005, 18:41 | ||||
Самый простой путь через popen().
Это в Windows извращенцы - засунуть в функцию CreateProcess 10 параметров, часть из которых еще и указатели на сложные структуры. |
| Автор: Vit 18.1.2005, 05:19 | ||
| Философский вопрос: если все процессы под Linux делаются путём fork, то как запускается самый первый процесс? Добавлено @ 05:20
WinExec - 2 параметра! |
| Автор: Sun 18.1.2005, 14:01 | ||
WinExec - deprecated со времен Windows95. |
| Автор: Vit 18.1.2005, 14:46 | ||
Но он работает... и будет работать |
| Автор: Sun 18.1.2005, 14:52 | ||||
Реально сейчас WinExec - это врапер для CreateProcess. Точно также как system() - функция объединяющая вызов fork() и execv(). Использовать WinExec не рекомендуют. |
| Автор: chipset 18.1.2005, 14:58 | ||
Делаем оболочку над CreateProcess и делов то.. Хотя это действительно извращение |
| Автор: oleg1973 19.1.2005, 12:27 |
| Sun system() не считается ибо не sys_call |
| Автор: Sun 19.1.2005, 14:14 | ||
Так я же про это и говорил. По той же причине WinExec не считается, так она лишь вызывает CreateProcess |