У меня такая проблема,
функция system() возвращает результат -1,
команда (сторока-параметр функции), если запускать ее из командной строки выполняется корректно.
Подскажите в чем может быть проблема? Как можно посмотреть какая ошибка при выполнении функции?
Заранее благодарен
Re: ошибка выполнения system()
От:
Аноним
Дата:
02.07.07 15:58
Оценка:
Здравствуйте, e.One, Вы писали:
EO>У меня такая проблема, EO>функция system() возвращает результат -1, EO>команда (сторока-параметр функции), если запускать ее из командной строки выполняется корректно.
EO>Подскажите в чем может быть проблема? Как можно посмотреть какая ошибка при выполнении функции?
EO>Заранее благодарен
Здравствуйте, e.One, Вы писали:
EO>У меня такая проблема, EO>функция system() возвращает результат -1, EO>команда (сторока-параметр функции), если запускать ее из командной строки выполняется корректно.
С путями все нормально? Попробуй использовать полный путь к файлу.
Могут быть проблемы с доступом, проверь права доступа ко всем используемым библиотекам свой программы(ldd)
Здравствуйте, Alexander Pazdnikov, Вы писали:
AP>Здравствуйте, e.One, Вы писали:
EO>>У меня такая проблема, EO>>функция system() возвращает результат -1, EO>>команда (сторока-параметр функции), если запускать ее из командной строки выполняется корректно. AP>С путями все нормально? Попробуй использовать полный путь к файлу. AP>Могут быть проблемы с доступом, проверь права доступа ко всем используемым библиотекам свой программы(ldd)
С путями все нормально, для тестирования использую вызов простого бат-файла, который записывает о своем вызове в другой файл. Как проверить права доступа?
Здравствуйте, e.One, Вы писали:
EO>С путями все нормально, для тестирования использую вызов простого бат-файла, который записывает о своем вызове в другой файл. Как проверить права доступа?
Насколько понимаю, речь идет о Windows. Возможно для бат-файла система не знает чем его интерпретировать.
Под Linux в командном файле можно указать первой строкой интерпретатор для выполнения скрипта, как это сделать под Windows — не знаю, но если все правильно, то у меня только оджно предположение.
Т.к. системный вызов system принимает в качестве аргумента только один параметр — путь к исполняемому файлу, скорее всего он может выполнять только exe или com.
Еще можно попробовать сменить расширение файла с *.bat на *.cmd (это в NT/2000/XP системные коммандные файлы).
Здравствуйте, Alexander Pazdnikov, Вы писали:
AP>Здравствуйте, e.One, Вы писали:
EO>>С путями все нормально, для тестирования использую вызов простого бат-файла, который записывает о своем вызове в другой файл. Как проверить права доступа?
AP>Насколько понимаю, речь идет о Windows. Возможно для бат-файла система не знает чем его интерпретировать. AP>Под Linux в командном файле можно указать первой строкой интерпретатор для выполнения скрипта, как это сделать под Windows — не знаю, но если все правильно, то у меня только оджно предположение. AP>Т.к. системный вызов system принимает в качестве аргумента только один параметр — путь к исполняемому файлу, скорее всего он может выполнять только exe или com. AP>Еще можно попробовать сменить расширение файла с *.bat на *.cmd (это в NT/2000/XP системные коммандные файлы).
Да, речь о виндовс. Программа сделана в виде вин-сервиса, когда я делаю ее в виде простого ехе-приложения, то вызов бат-файла происходит. И еще одна засада — на другом компе вин-сервис вызывает батник корректно. Может это связано с операционной системой (на ХР запускается, на win 2000 server — нет)?
Здравствуйте, e.One, Вы писали:
EO>Да, речь о виндовс. Программа сделана в виде вин-сервиса, когда я делаю ее в виде простого ехе-приложения, то вызов бат-файла происходит. И еще одна засада — на другом компе вин-сервис вызывает батник корректно. Может это связано с операционной системой (на ХР запускается, на win 2000 server — нет)?
Расширение с *.bat на *.cmd поменяли ?
Почему на ХР запускается на 2000 — нет, не могу.
Остался последний совет, попробуйте использовать функции POSIX группы execv, может в Windows остались функции группы spawn/spawnl (нет MSDN под рукой).
Вообще системный вызов system используется очень редко(и пришел он из Unix систем, вполне может быть что MS его поддерживает как пережиток), и его всегда можно заменить функциями линейки execv/execve. Попробуйте глянуть в MSDN в сторону этих функций. Для этого порождается дочерний процесс функцией fork/clone, в порожденном процессе запускается внешняя программа( в вашем случае 0-ым параметром для функций будет интерпретатор cmd-файлов, что типа windows\cmd, 1-ым параметром будет путь к исполняемому скрипту), родительский процеес ждет завершения дочернего (waitpid) и получает результат выполнения в параметре status.
Используйся CreateProcess, при этом в качестве исполняемого файла указывается cmd.exe, параметром передается .bat файл. Сервису возможно потребуется разрешение "allow interact with desktop"
Здравствуйте, e.One, Вы писали:
EO>У меня такая проблема, EO>функция system() возвращает результат -1, EO>команда (сторока-параметр функции), если запускать ее из командной строки выполняется корректно.
EO>Подскажите в чем может быть проблема? Как можно посмотреть какая ошибка при выполнении функции?
EO>Заранее благодарен
Re: ошибка выполнения system()
От:
Аноним
Дата:
03.07.07 18:02
Оценка:
Здравствуйте, e.One, Вы писали:
EO>У меня такая проблема, EO>функция system() возвращает результат -1,
возможно так
cmd /c xz.bat
Набери в командной строке >start cmd /? там все написано.
Здравствуйте, Alexander Pazdnikov, Вы писали:
AP>Под Linux в командном файле можно указать первой строкой интерпретатор для выполнения скрипта, как это сделать под Windows — не знаю,
В Windows,насколько я знаю, в реестре указывается ассоциация расширения файла с соответствующей программой, в данном случае — с интерпретатором.
А кстати, в unix функция system(), грубо говоря, делает fork(), родительский процесс ожидает завершения дочернего, а дочерний выполняет execve для /bin/sh, которому передает на выполнение свой аргумент.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
> EO>>С путями все нормально, для тестирования использую вызов простого бат-файла, который записывает о своем вызове в другой файл. Как проверить права доступа? > > AP>Насколько понимаю, речь идет о Windows. Возможно для бат-файла система не знает чем его интерпретировать. > AP>Под Linux в командном файле можно указать первой строкой интерпретатор для выполнения скрипта, как это сделать под Windows — не знаю, но если все правильно, то у меня только оджно предположение. > AP>Т.к. системный вызов system принимает в качестве аргумента только один параметр — путь к исполняемому файлу, скорее всего он может выполнять только exe или com. > AP>Еще можно попробовать сменить расширение файла с *.bat на *.cmd (это в NT/2000/XP системные коммандные файлы). > > Да, речь о виндовс. Программа сделана в виде вин-сервиса, когда я делаю ее в виде простого ехе-приложения, то вызов бат-файла происходит. И еще одна засада — на другом компе вин-сервис вызывает батник корректно. Может это связано с операционной системой (на ХР запускается, на win 2000 server — нет)?
Почти наверняка это связано с тем, что сервис работает под другой учетной записью. Прав не хватает скорее всего, или в политиках чего-нибудь запрещено или еще какие security-related заморочки.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Sergey, Alexander Pazdnikov, Nazik, Вы писали:
S>Почти наверняка это связано с тем, что сервис работает под другой учетной записью. Прав не хватает скорее всего, или в политиках чего-нибудь запрещено или еще какие security-related заморочки.
Та да, учетная запись system не может запустить другой процес, почему не знаю, поскольку особо в этом не разбираюсь.
AP>Остался последний совет, попробуйте использовать функции POSIX группы execv, может в Windows остались функции группы spawn/spawnl (нет MSDN под рукой).
N>Используйся CreateProcess, при этом в качестве исполняемого файла указывается cmd.exe, параметром передается .bat файл. Сервису возможно потребуется разрешение "allow interact with desktop"
Не смог запустить никакой функцией, даже CreateProcessWithLogonW, выдает Access denied.
Решил проблему: запускаю службу под учетной записью администратора.