Прочтите, где это следует использовать WEXITSTATUS
для проверки статуса возврата системных вызовов. Однако я не думаю, что вызов, подобный system("mv/a/b/c/a/b/d")
нуждается в проверке, если он терпит неудачу.
Каковы условия, когда этот вызов может завершиться неудачей?
Некоторые возможности:
/a/b/c
не существует/a/b
не существует/a/b/c
/a/b/d
/a/b/d
уже существует/a/b/c
не является подвижнымmv
не существуетmv
И многие, и многое другое...
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)...).