waitpid, похоже, не ждет

0

У меня простая функция - ее цель - скопировать файл в.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");
        }
    }
}
  • 0
    Помимо принятого ответа на waitpid , все в этом предложении else довольно шаткое кодирование.
  • 0
    Из-за особенностей настройки приложения чтение / запись будут редкими и вряд ли будут отличаться от значений по умолчанию. Как таковой в крайне маловероятной проблеме, код терпит неудачу, это не главная проблема. Либо это работает, либо нет, ничего страшного, воткните это в логи. Насколько я знаю, что все вышеперечисленное охватывает практически любой случай? Может быть, я должен хранить что-то более конкретное, но здесь это кажется немного излишним.
Показать ещё 3 комментария
Теги:
process
cp
waitpid

1 ответ

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

Конечно же waitpid не ждет. Вы сказали это не:

pid_t ws = waitpid( pid, &childExitStatus, WNOHANG);

WNOHANG означает "не ждите". Измените WNOHANG на 0, если вы хотите waitpid ждать.

  • 0
    Сделал ошибку, слепо скопировав код из другого принятого ответа. Я провел 40 минут, уставившись на него, почесывая голову. Чувствую себя довольно глупо прямо сейчас. Спасибо
  • 1
    Надеюсь, урок выучен: всегда проверяйте справочные страницы.

Ещё вопросы

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