У меня простая функция - ее цель - скопировать файл в.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
ждать.
waitpid
, все в этом предложении else довольно шаткое кодирование.