Официальный форум СВД Встраиваемые Системы
25 Апрель, 2024, 15:54:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Странности при отработке ф-ции system()  (Прочитано 1090 раз)
LH
Ветеран

Сообщений: 345


« : 10 Август, 2017, 15:16:08 »

Есть простой код:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int ret;
...
  ret=system("uname -a");   //любая команда sh
...
}

При исполнении ф-ция system() выполняется без ошибки,
выводится результат выполнения команды "uname -a", ret = 0;


Теперь 2 контроллера А1 и А2 в Qnet сети, и на удаленном контроллере А2 есть файл /net/A2/tmp/tmpfile.

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
  int ret,fp;
...
  fp=open("/net/A2/tmp/tmpfile",O_RDWR);
  ret=system("uname -a");
...
}

При исполнении программы на контроллере А1 и при удачном открытии удаленного файла,
так что  fp>0, ф-ция system("uname -a") завершается с ошибкой,выводится "sh: can't fork, try again".

Код ошибки ret=256, "Socket is already connected".

Как можно объяснить отказ system() вызывать sh и выполнять команду при открытом файле на удаленном контроллере?

Спасибо.




« Последнее редактирование: 10 Август, 2017, 18:38:14 от LH » Записан
Андрей Сеньков
Администратор
Ветеран

Сообщений: 339



WWW
« Ответ #1 : 15 Август, 2017, 18:19:06 »

Добрый день!

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

Дополнительно отмечу, что fork() может завершиться с ошибкой, например, если недостаточно ресурсов или при попытке форкнуть многопоточное приложение. Второе замечание: анализировать код возврата функции system() нужно с помощью макроса WEXITSTATUS, как это указано в документации на system. Иначе говоря, Ваша интерпретация ошибки как "Socket is already connected" не вполне корректна.
Записан

LH
Ветеран

Сообщений: 345


« Ответ #2 : 16 Август, 2017, 09:08:17 »

Спасибо за подсказку насчет интерпретации errno и WEXITSTATUS().

Отмечу , что в документации на system() чуть ниже написано

Цитировать
When an error has occurred, errno contains a value that indicates the type of error that has been detected.

Examples:

Многопоточные приложения при тестировании не запущены, ресурсы системы - свободны...

Код теста простого и результаты вывода отправил на эл.почту

Спасибо за поддержку.

Олег Большаков: Удалил адрес электронной почты.
« Последнее редактирование: 16 Август, 2017, 14:34:35 от Олег Большаков » Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #3 : 18 Август, 2017, 11:51:24 »

LH, Ваше письмо получили, разбираемся.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2024 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 19 Февраль, 2024, 18:00:52