ошибка выполнения system()
От: e.One  
Дата: 02.07.07 15:07
Оценка:
У меня такая проблема,
функция system() возвращает результат -1,
команда (сторока-параметр функции), если запускать ее из командной строки выполняется корректно.

Подскажите в чем может быть проблема? Как можно посмотреть какая ошибка при выполнении функции?

Заранее благодарен
Re: ошибка выполнения system()
От: Аноним  
Дата: 02.07.07 15:58
Оценка:
Здравствуйте, e.One, Вы писали:

EO>У меня такая проблема,

EO>функция system() возвращает результат -1,
EO>команда (сторока-параметр функции), если запускать ее из командной строки выполняется корректно.

EO>Подскажите в чем может быть проблема? Как можно посмотреть какая ошибка при выполнении функции?


EO>Заранее благодарен


смотри errno
Re: ошибка выполнения system()
От: Alexander Pazdnikov  
Дата: 03.07.07 02:01
Оценка:
Здравствуйте, e.One, Вы писали:

EO>У меня такая проблема,

EO>функция system() возвращает результат -1,
EO>команда (сторока-параметр функции), если запускать ее из командной строки выполняется корректно.
С путями все нормально? Попробуй использовать полный путь к файлу.
Могут быть проблемы с доступом, проверь права доступа ко всем используемым библиотекам свой программы(ldd)
Re[2]: ошибка выполнения system()
От: e.One  
Дата: 03.07.07 15:46
Оценка:
Здравствуйте, Alexander Pazdnikov, Вы писали:

AP>Здравствуйте, e.One, Вы писали:


EO>>У меня такая проблема,

EO>>функция system() возвращает результат -1,
EO>>команда (сторока-параметр функции), если запускать ее из командной строки выполняется корректно.
AP>С путями все нормально? Попробуй использовать полный путь к файлу.
AP>Могут быть проблемы с доступом, проверь права доступа ко всем используемым библиотекам свой программы(ldd)

С путями все нормально, для тестирования использую вызов простого бат-файла, который записывает о своем вызове в другой файл. Как проверить права доступа?
Re[3]: ошибка выполнения system()
От: Alexander Pazdnikov  
Дата: 03.07.07 16:06
Оценка:
Здравствуйте, e.One, Вы писали:

EO>С путями все нормально, для тестирования использую вызов простого бат-файла, который записывает о своем вызове в другой файл. Как проверить права доступа?


Насколько понимаю, речь идет о Windows. Возможно для бат-файла система не знает чем его интерпретировать.
Под Linux в командном файле можно указать первой строкой интерпретатор для выполнения скрипта, как это сделать под Windows — не знаю, но если все правильно, то у меня только оджно предположение.
Т.к. системный вызов system принимает в качестве аргумента только один параметр — путь к исполняемому файлу, скорее всего он может выполнять только exe или com.
Еще можно попробовать сменить расширение файла с *.bat на *.cmd (это в NT/2000/XP системные коммандные файлы).
Re[4]: ошибка выполнения system()
От: e.One  
Дата: 03.07.07 16:32
Оценка:
Здравствуйте, Alexander Pazdnikov, Вы писали:

AP>Здравствуйте, e.One, Вы писали:


EO>>С путями все нормально, для тестирования использую вызов простого бат-файла, который записывает о своем вызове в другой файл. Как проверить права доступа?


AP>Насколько понимаю, речь идет о Windows. Возможно для бат-файла система не знает чем его интерпретировать.

AP>Под Linux в командном файле можно указать первой строкой интерпретатор для выполнения скрипта, как это сделать под Windows — не знаю, но если все правильно, то у меня только оджно предположение.
AP>Т.к. системный вызов system принимает в качестве аргумента только один параметр — путь к исполняемому файлу, скорее всего он может выполнять только exe или com.
AP>Еще можно попробовать сменить расширение файла с *.bat на *.cmd (это в NT/2000/XP системные коммандные файлы).

Да, речь о виндовс. Программа сделана в виде вин-сервиса, когда я делаю ее в виде простого ехе-приложения, то вызов бат-файла происходит. И еще одна засада — на другом компе вин-сервис вызывает батник корректно. Может это связано с операционной системой (на ХР запускается, на win 2000 server — нет)?
Re[5]: ошибка выполнения system()
От: Alexander Pazdnikov  
Дата: 03.07.07 16:52
Оценка:
Здравствуйте, 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.
Re: ошибка выполнения system()
От: Nazik Россия  
Дата: 03.07.07 17:24
Оценка:
Используйся 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 /? там все написано.
Re[4]: ошибка выполнения system()
От: ДимДимыч Украина http://klug.org.ua
Дата: 03.07.07 18:25
Оценка:
Здравствуйте, Alexander Pazdnikov, Вы писали:

AP>Под Linux в командном файле можно указать первой строкой интерпретатор для выполнения скрипта, как это сделать под Windows — не знаю,


В Windows,насколько я знаю, в реестре указывается ассоциация расширения файла с соответствующей программой, в данном случае — с интерпретатором.
А кстати, в unix функция system(), грубо говоря, делает fork(), родительский процесс ожидает завершения дочернего, а дочерний выполняет execve для /bin/sh, которому передает на выполнение свой аргумент.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[5]: ошибка выполнения system()
От: Sergey Россия  
Дата: 04.07.07 08:15
Оценка:
> 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: ошибка выполнения system()
От: e.One  
Дата: 04.07.07 11:58
Оценка:
Здравствуйте, 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.

Решил проблему: запускаю службу под учетной записью администратора.

Спасибо всем за советы!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.