Использование команды system(3)
, вероятно, является хорошей идеей, поскольку вы получаете удобство интерпретатора оболочки для расширения имен файлов (через *
), но избегаете хлопот вычисления точной длины буфера, необходимого для печати команды, используябуфер фиксированной длины и гарантирующий, что он не может переполниться:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUFSZ 0xFFF
int main(void)
{
char * ohome = getenv("ORACLE_HOME"), cmd[BUFSZ];
char * fmt="/bin/mv %s/%s/* %s/%s";
int written = snprintf(cmd, BUFSZ, fmt, ohome, "A", ohome, "B"), ret;
if ((written < 0) || (written >= (BUFSZ-1))) {
/* ERROR: print error or ORACLE_HOME env var too long for BUFSZ. */
}
if ((ret = system(cmd)) == 0) {
/* OK, move succeeded. */
}
return 0;
}
Как отмечает комментатор Paul Kuliniewicz, могут возникнуть непредвиденные результаты, если ваш ORACLE_HOME содержит пробелы или другие специальные символы, которые могут интерпретироваться подоболочкой в "системе"команда.Использование одного из семейств execl
или execv
позволит вам создавать аргументы, не беспокоясь о том, что интерпретатор оболочки выполняет свою собственную интерпретацию, но за счет использования подстановочных знаков.