У меня есть простая функция — ее цель — скопировать файл в .old перед его перезаписью. Потому что я ленивый (и ответ на этот вопрос предложил это), я использую cp для выполнения работы.
Затем я вызываю waitpid и проверяю коды возврата.
Код, вызывающий это, вызывает мою функцию копирования, а затем сразу открывает файл для чтения. Каким-то образом код вызова запускается перед вызовом cp — новый файл — это то, что копируется.
Лучший пример — если не существует ни файла, ни резервной копии. Оба созданы и содержат то, что я сохранил.
Я изо всех сил, чтобы увидеть, где я ошибся, помощь будет принята.
copy_old();
std::ofstream savefile (SETTINGS_LOCATION);
if (savefile.is_open())
{
savefile << ...void settings::copy_old()
{
int childExitStatus;
pid_t pid;
pid = fork();
if (pid == 0) { /* child */
execl("/bin/cp", "/bin/cp", "-f", SETTINGS_LOCATION, SETTINGS_LOCATION_B, (char *)0);
}
else if (pid < 0) {
ERR("Could not Backup Previous Settings");
}
else {
pid_t ws = waitpid( pid, &childExitStatus, WNOHANG);
if (ws == -1)
{
ERR("Could not Backup Previous Settings1");
}
if( !WIFEXITED(childExitStatus) || WEXITSTATUS(childExitStatus)) /* exit code in childExitStatus */
{
ERR("Settings backup may have been unsuccessful");
}
}
}
Конечно waitpid
не ждет Вы сказали это не:
pid_t ws = waitpid( pid, &childExitStatus, WNOHANG);
WNOHANG
означает «не жди». Измени это WNOHANG
до 0, если хотите waitpid
ждать.
Других решений пока нет …