LINUX.ORG.RU

Не выполняется system()

 


0

1

Мне необходимо слегка модифицировать один опенсорцный проект. В одном из файлов проекта (который выполняется) я написал system(«mkdir /tmp/test»);

Но этот код (как и любой другой башовский) не выполняется. В чем может быть причина ? Значение, возвращаемое system, отследить не могу, т.к. проект является демоном.


это только на одной машине? если так, то напиши минимальный тестовый файл, в котором вызови system, а там уже отследи, что не так. более того,

я написал system(«mkdir /tmp/test»);

man 2 mkdir

Deleted
()
Ответ на: комментарий от I-Love-Microsoft

Выполнение данного кода отследить не могу, поэтому сделал так: system(«bash -c 'uname -a > testik.txt'»); Файл не создался.

sa1mon
() автор топика
Ответ на: комментарий от Deleted

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

sa1mon
() автор топика

Значение, возвращаемое system, отследить не могу, т.к. проект является демоном.

Сбрось его в syslog. Демон с какими правами работает?

UVV ★★★★★
()
Ответ на: комментарий от sa1mon

а выложить код не можешь?

вангую, что этот код просто выполняется в той ветке, до которой исполнение не доходит

Deleted
()
Ответ на: комментарий от zloy_starper

Создание каталога - это для проверки работоспособности. На самом деле нужно более сложные вещи сделать.

sa1mon
() автор топика

Значение, возвращаемое system, отследить не могу, т.к. проект является демоном.

Ээээ, а посмотреть чему равен код возврата system(а он есть!) через syslog - религия не позволяет?

Цитата из man system:

RETURN VALUE
       The return value of system() is one of the following:

       *  If command is NULL, then a nonzero value if a shell is available, or 0 if no shell is available.

       *  If a child process could not be created, or its status could not be retrieved, the return value is -1.

       *  If  a  shell  could not be executed in the child process, then the return value is as though the child shell terminated by calling _exit(2) with
          the status 127.

       *  If all system calls succeed, then the return value is the termination status of the child shell used to execute command.  (The termination  sta-
          tus of a shell is the termination status of the last command it executes.)

       In the last two cases, the return value is a "wait status" that can be examined using the macros described in waitpid(2).  (i.e., WIFEXITED(), WEX-
       ITSTATUS(), and so on).

       system() does not affect the wait status of any other children.

Для работы с syslog кури man openlog, например

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)

Запусти через strace -f, посмотри, какой код возрата у твоего system.

mv ★★★★★
()
Ответ на: комментарий от DELIRIUM

Демон который я ковыряю пишет логи при добавлении файла в указанную директорию. Соответственно, добавляя файл в указанную директорию у меня пишется лог. Т.е. код выполняется.

sa1mon
() автор топика
Ответ на: комментарий от Pinkbyte

Попробую после выходных это дело провернуть. Спасибо.

sa1mon
() автор топика
Ответ на: комментарий от sa1mon

а просто

#include <stdlib.h>
int main()
{
    system("echo hello");
}
gcc he.c ; ./a.out #hello покажет?
Dron ★★★★★
()
Последнее исправление: Dron (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

это ересь, потому что system - это уже вызов execl с башем:
execl(«/bin/sh», «sh», "-c", command, (char *) 0);
по определению. вызов баша из баша какбэ излишен.

что касается вопроса, почему баш не срабатывает: скорее всего, нет линка /bin/sh.

Iron_Bug ★★★★★
()

и да, у демона может не быть переменных окружения. так что он не может найти твой mkdir. нужен полный путь: /bin/mkdir.

Iron_Bug ★★★★★
()

А тот демон часом не в чруте сидит?

FeyFre ★★★★
()
Ответ на: комментарий от I-Love-Microsoft

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)

Переустановил виртуалку, заново поставил софт и ... все заработало. System выполняется :) Всем спасибо за помощь.

sa1mon
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.