У меня есть код 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 кода и запускаю его).
Кто-нибудь знает, почему?
Спасибо
popen
? Каково значениеerrno
? - person KamilCuk   schedule 09.02.2021if (jitter == NULL) perror("popen failed");
? - person Jeremy Friesner   schedule 09.02.2021jitter = popen("chronyc sources", "r");
? Или вы утверждаете, что он не выполняет операторcout<<"line is\n"<<line<<endl;
? (Или и то, и другое?) Было бы здорово, если бы вы разместили фактический код вместо выдержки.ntp
,start
,eol
,pps
все лишни для вашего примера кода как есть. Попробуйте еще раз с чем-нибудь простым, напримерjitter = popen("ls", "r")
. Проверьте возвращаемое значениеpopen
на наличие ошибок. - person Wyck   schedule 09.02.2021jitter
в качестве аргумента (джиттеру присваивается результат popen, который является либо дескриптором файла, либо nullptr). В документации для fgets сказано, что он возвращает nullptr, если A) произошла ошибка (например, при сбое popen) или B) если достигнут EOF входного потока. Что сделало бы условие цикла ложным. Вероятно, происходит А. Вот почему я сказал попробовать еще раз с помощью popen(ls,r) или потому, что вероятность неудачи меньше. - person Wyck   schedule 10.02.2021if(jitter==NULL){cout<<"popen failed<<endl;)}
. но это тоже никогда не печатает - person bchang32   schedule 10.02.20212>&1
к команде. См. stackoverflow.com/questions/6900577/c-popen- не поймать-stderr - person Wyck   schedule 10.02.2021