с ++. когда системный вызов может перестать работать?

0

Прочтите, где это следует использовать WEXITSTATUS для проверки статуса возврата системных вызовов. Однако я не думаю, что вызов, подобный system("mv/a/b/c/a/b/d") нуждается в проверке, если он терпит неудачу.

Каковы условия, когда этот вызов может завершиться неудачей?

  • 0
    На какой операционной системе?
  • 0
    Linux - это ОС.
Показать ещё 1 комментарий
Теги:
system

2 ответа

3
Лучший ответ

Некоторые возможности:

  1. /a/b/c не существует
  2. /a/b не существует
  3. У вас недостаточно доступа к /a/b/c
  4. У вас недостаточно доступа к /a/b/d
  5. /a/b/d уже существует
  6. /a/b/c не является подвижным
  7. Нет оболочки
  8. mv не существует
  9. У вас недостаточно доступа к mv
  10. У вас нет установленной файловой системы
  11. У вас нет свободного места на складе

И многие, и многое другое...

  • 0
    / a / b / c используется другой программой или заблокирован
2

system("mv/a/b/c/a/b/d"): очень вероятно, что оба /a/b/c и /a/b/d лежат на одной и той же смонтированной файловой системе. Я предполагаю, что у вас есть система Posix, возможно, Linux.

Тогда гораздо проще использовать переименовать (2) syscall (который вызван /bin/mv если это необходимо!) И непосредственно код:

if (rename("/a/b/c", "/a/b/d")) {
   perror("rename failed");
   exit(EXIT_FAILURE);
}

и у вас было бы errno (3), т.е. через perror (3) код ошибки, объясняющий, почему переименование не удалось. Все условия ошибки в переименовании (2) являются релевантными случаями отказа mv, см. Также mv (1) !

Прочтите расширенное программирование на Linux.

Если (по какой-то странной причине, например bind mounts, symlinks,...) /a/b/c и /a/b/d не лежат в одной файловой системе, вы получите errno == EXDEV (и вы можете обработайте этот случай копией, за которой следует unlink источника).

В общем, следует избегать использования system("mv... "). См. Этот ответ, и это объясняет, почему (а также это и это). И у вашего пользователя может быть другое mv в его PATH (или какой-то псевдоним), поэтому mv должен по крайней мере быть /bin/mv... If . (или даже хуже /tmp !) на ранней стадии его PATH и имеет символическую ссылку mv/bin/rm ваш пользователь не будет счастлив!

Кстати, вы вообще не вызываете system с постоянной константой компиляции, начиная с mv. Эта строка, как правило, построена. И если вы не указываете правильно вещи (представьте себе один аргумент ; rm -rf $HOME) может произойти хаос. Кроме того, система (3) может выйти из строя, например, потому что fork (2) не удалось (слишком много пользовательских процессов, достигнув предела RLIMIT_NPROC для setrlimit (2)...).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню