Ich speichere eine Reihe von pid
s (d. H. Linux-Prozess-IDs) in einem Array von long
s. Ich stelle fest, dass ein pid
kein long
ist, aber ich habe keine Wahl in Bezug auf die Verwendung eines anderen Variablentyps.Drucken pid mit% d vs% ld, linux
Das Problem, das ich habe, tritt auf, wenn ich versuche, pid
mit printf
zu drucken. Wenn ich die long
drucken, die pid
mit %ld
speichert, ich die falsche pids erhalten:
8435315771308 process_ancesto
8358006359962 bash
8353711392665 login
4294967297 init
0 swapper/0
Wenn ich jedoch %d
Drucke mit (die eine Compiler-Warnung erzeugt), habe ich das richtige Ergebnis erhalten (dh das Ergebnis zurückgegeben von ps
in das Terminal eingeben):
1969 process_ancesto
1946 bash
1945 login
1 init
0 swapper/0
Was dieses Verhalten verursacht? Ein Pid -> Long Cast ist eine Erweiterung und sollte keine Probleme verursachen.
Hier ist das Programm, das ich verwende, um den Systemaufruf zu machen, die die PIDs zurückzugibt:
int main(int argc, char *argv[])
{
struct process_info arr[10];
long n=0;
int result = syscall(_CS300_PROCESS_ANCESTORS_, arr,10,&n);
assert(result==0);
for(int i=0;i<n;i++) {
printf("%d %s\n",arr[i].pid,arr[i].name);
}
return 0;
}
Wenn ich die %d
mit %ld
druckt falsche Informationen ersetzen. Hier
ist die Linie von meinem Systemaufruf, wo ich notiere die pid
:
if(copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_task->pid)) {
return -EFAULT;
}
info_array[num_filled_kernel].pid
ein lang ist.
uns zeigen eine vollständige aber Minimalprogramm Arbeitsprobe, die Ihre demonstriert Problem. –
Welche Art von Computer verwenden Sie (Intel? 32 oder 64 Bit?) - erzählt uns mehr über Ihre Umgebung. – Soren
Intel, 64-Bit Ubuntu 14.04 – Adam