Почему команда faketime пропускает раздел кода

У меня есть код cpp, который я пытаюсь запустить с помощью команды faketime. Я запускаю его на двух одинаковых компьютерах. Они оба работают под управлением RHEL 7. Я заметил, что когда я запускаю свой код на одном компьютере, он полностью пропускает вызов popen.

Мой код по существу

char ntp[]= "192.168.1.200";
    FILE *jitter;
    char line[100];
    char *start;
    char * eol;
    char pps[] = "NTPS";
    jitter = popen("chronyc sources", "r");
        int i;
cout<<"reached here"<<endl;
    while(fgets(line,sizeof(line),jitter))
{
cout<<"line is\n"<<line<<endl;
 if(strstr(line,pps)){
        start = strpbrk(line,"#0+-");    
        cout<<"PPS is "<<start<<endl; 
        //find new line character and replace it with comma
        eol = strrchr(start,'\n');
        i=eol-start;
        start[i]=',';
    
        myfile<<start;
    }

    if(strstr(line,ntp)){
        myfile<<start;  
    }
}
    pclose(jitter);
}

Я добавил оператор печати

cout<<"reached here"<<endl;

но когда я запускаю его с поддельным временем «последняя пятница, 17:00»./code, на одном компьютере он по какой-то причине никогда не достигает оператора печати, а на другом — делает. Я безуспешно искал в Интернете (я не использую приближенный алгоритм, у них один и тот же компилятор и файл make и т. д. Я буквально делаю git pull кода и запускаю его).

Кто-нибудь знает, почему?

Спасибо


person bchang32    schedule 09.02.2021    source источник
comment
Так что же возвращает popen? Каково значение errno?   -  person KamilCuk    schedule 09.02.2021
comment
@KamilCuk popen возвращает значение хронических источников. errno равно 0, так что это не похоже на ошибку   -  person bchang32    schedule 09.02.2021
comment
Вы должны показать код с оператором печати на месте - на случай, если есть проблема с управлением потоком, препятствующая его выполнению.   -  person Wyck    schedule 09.02.2021
comment
@Wyck готово ... (это было буквально сразу после оператора while, по сути печатающего fgetsline). Что странно, так это то, что если я не выполню команду faketime, она напечатает строку.   -  person bchang32    schedule 09.02.2021
comment
Где находится линия if (jitter == NULL) perror("popen failed");?   -  person Jeremy Friesner    schedule 09.02.2021
comment
@JeremyFriesner Я поставил один над строкой cout‹‹ is‹‹, а также сразу после окончания цикла while, и до сих пор нет разницы в поведении или выводах   -  person bchang32    schedule 09.02.2021
comment
Вы утверждаете, что он не выполняет оператор jitter = popen("chronyc sources", "r");? Или вы утверждаете, что он не выполняет оператор cout<<"line is\n"<<line<<endl;? (Или и то, и другое?) Было бы здорово, если бы вы разместили фактический код вместо выдержки. ntp, start, eol, pps все лишни для вашего примера кода как есть. Попробуйте еще раз с чем-нибудь простым, например jitter = popen("ls", "r"). Проверьте возвращаемое значение popen на наличие ошибок.   -  person Wyck    schedule 09.02.2021
comment
@Wyck Когда я запускаю свой код с предисловием к поддельному времени (то есть поддельное время 5 дней назад ./code_run), он игнорирует цикл while fgets, поэтому оба. Фактический код приведен выше, плюс он записывает вызов источников chronyc в файл csv, поэтому я не думал, что вам нужно видеть операторы строки myfile ‹‹   -  person bchang32    schedule 09.02.2021
comment
Сказать, что он игнорирует цикл, неверно. Наверняка он вызывает fgets, передавая jitter в качестве аргумента (джиттеру присваивается результат popen, который является либо дескриптором файла, либо nullptr). В документации для fgets сказано, что он возвращает nullptr, если A) произошла ошибка (например, при сбое popen) или B) если достигнут EOF входного потока. Что сделало бы условие цикла ложным. Вероятно, происходит А. Вот почему я сказал попробовать еще раз с помощью popen(ls,r) или потому, что вероятность неудачи меньше.   -  person Wyck    schedule 10.02.2021
comment
@Wyck хорошо, так что выполнение ls работает, но это все еще не объясняет, почему хронические источники терпят неудачу, когда я добавляю к ним поддельное время на одном компьютере, но не на другом, и почему это заставляет его ничего не читать по сравнению с чтением хронических источников, когда я не не добавляйте это. Мне нужен вызов источников chronycc, а не ls. Я добавил if(jitter==NULL){cout<<"popen failed<<endl;)}. но это тоже никогда не печатает   -  person bchang32    schedule 10.02.2021
comment
chronyc может дать сбой и записать сообщение об ошибке в stderr, которое popen не будет читать (он читает только stdout). Попробуйте добавить 2>&1 к команде. См. stackoverflow.com/questions/6900577/c-popen- не поймать-stderr   -  person Wyck    schedule 10.02.2021
comment
@Wyck, когда я это делаю, выводит, что faketime failed В ft_shm_init() ошибка открытия sem: функция не реализована, я понятия не имею, что это значит и как решить эту проблему.   -  person bchang32    schedule 11.02.2021
comment
Я думаю, пришло время добавить тег хронии к этому вопросу. Кроме того, обновите вопрос, указав всю актуальную новую информацию, которую вы обнаружили. Можете ли вы просто запустить команду вручную из командной строки и посмотреть, работает ли она?   -  person Wyck    schedule 11.02.2021


Ответы (1)


Похоже, проблема была в SELinux. По-видимому, chrony плохо взаимодействует, когда SELinux находится в принудительном режиме. Я переключил его на разрешающий, и теперь он ведет себя так, как ожидалось. Я могу вызвать faketime 'last friday 5pm' chronyc sources, а также использовать его в своем коде popen

person bchang32    schedule 12.02.2021