0

openBSD5.1 で net-snmp 5.7.1 をコンパイルしようとしています。コンパイル時のエラーは

構造体にはkp_proc' structure has no member namedkp_eproc'という名前のメンバーがありません

誰でもこれについて私を助けることができますか??

そしてopenBSDでpythonバインディングを行う方法は??

4

1 に答える 1

1

あなたのソフトウェアを OpenBSD に移植しようとしているので、これは長い投稿になるかもしれません。
OpenBSD には、k_proc 構造体にこの eproc フィールドがありません。宣言を確認してください: proc@OpenBSD

最新のソースの問題をgrep:

./agent/mibgroup/host/data_access/swrun_kinfo.c:        entry->hrSWRunPerfCPU  =     proc_table[i].kp_eproc.e_uticks;
./agent/mibgroup/host/data_access/swrun_kinfo.c:        entry->hrSWRunPerfCPU += proc_table[i].kp_eproc.e_sticks;
./agent/mibgroup/host/data_access/swrun_kinfo.c:        entry->hrSWRunPerfCPU +=   proc_table[i].kp_eproc.e_iticks;
./agent/mibgroup/host/data_access/swrun_kinfo.c:        entry->hrSWRunPerfMem  = proc_table[i].kp_eproc.e_vm.vm_tsize;
./agent/mibgroup/host/data_access/swrun_kinfo.c:        entry->hrSWRunPerfMem += proc_table[i].kp_eproc.e_vm.vm_ssize;
./agent/mibgroup/host/data_access/swrun_kinfo.c:        entry->hrSWRunPerfMem += proc_table[i].kp_eproc.e_vm.vm_dsize;
./agent/mibgroup/host/hr_swrun.c:        long_return = proc_table[LowProcIndex].kp_eproc.e_uticks +
./agent/mibgroup/host/hr_swrun.c:            proc_table[LowProcIndex].kp_eproc.e_sticks +
./agent/mibgroup/host/hr_swrun.c:            proc_table[LowProcIndex].kp_eproc.e_iticks;
./agent/mibgroup/host/hr_swrun.c:            proc_table[LowProcIndex].kp_eproc.e_vm.vm_map.size / 1024;
./agent/mibgroup/host/hr_swrun.c:        long_return = proc_table[LowProcIndex].kp_eproc.e_vm.vm_tsize +
./agent/mibgroup/host/hr_swrun.c:            proc_table[LowProcIndex].kp_eproc.e_vm.vm_ssize +
./agent/mibgroup/host/hr_swrun.c:            proc_table[LowProcIndex].kp_eproc.e_vm.vm_dsize;
./agent/mibgroup/ucd-snmp/proc.c:#define EP(pp, field) ((pp)->kp_eproc . field)
./agent/mibgroup/ucd-snmp/proc.c:#define VP(pp, field) ((pp)->kp_eproc.e_vm . field)

あはは!したがって、これらの vm 構造体も処理する必要があります...対応する宣言は次のとおりです: p_vmspace@OpenBSD

一般に、これらの .kp_eproc.e_thing を .p_thing
に、.kp_eproc.e_vm.thing を .p_vmspace->thing (ポインタ) に 変更するとうまくいくはずです。

マクロには注意が必要で、正しく理解できたと思いますが、かなり遅いsparc64 でこれらの変更をまだコンパイルしているので、テスト済みの diff を取得するには時間がかかります。

しかし、それは一般的な考えであるべきです。

プロセス全体が正常に動作する場合は、簡単に作成できる Makefile と一緒にこのパッチを ports/tree に追加し、OpenBSD パッケージを pkg_* ツールで管理できますが、今後の編集でさらに多くのことが行われます。

乾杯!

DSP

編集: これはコンパイルされる最初の diff ですが、2 番目のマクロは間違っています。テストしてください。

diff -ur net-snmp-5.7.1/agent/mibgroup/host/data_access/swrun_kinfo.c mynet-    snmp-5.7.1/agent/mibgroup/host/data_access/swrun_kinfo.c
--- net-snmp-5.7.1/agent/mibgroup/host/data_access/swrun_kinfo.c        Wed Sep 28 07:53:47 2011
+++ mynet-snmp-5.7.1/agent/mibgroup/host/data_access/swrun_kinfo.c      Wed Sep  5 04:26:54 2012
@@ -85,10 +85,10 @@
  * early FreeBSD, NetBSD, OpenBSD kinfo_proc field names
  */
 #define SWRUN_TABLE    kinfo_proc
 -#define SWRUN_K_STAT   kp_proc.p_stat
 -#define SWRUN_K_PID    kp_proc.p_pid
 -#define SWRUN_K_COMM   kp_proc.p_comm
 -#define SWRUN_K_FLAG   kp_proc.p_flag
 +#define SWRUN_K_STAT   p_stat
 +#define SWRUN_K_PID    p_pid
 +#define SWRUN_K_COMM   p_comm
 +#define SWRUN_K_FLAG   p_flag
 /*      SWRUN_K_CLASS  not defined     */
 #endif

@@ -159,7 +159,8 @@
 #if HAVE_KVM_GETPROC2
     proc_table = kvm_getproc2(kd, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc2), &nprocs );
 #else
-    proc_table = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nprocs );
+    proc_table = kvm_getprocs(kd, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc), &nprocs );
+    //proc_table = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nprocs );
 #endif
     for ( i=0 ; i<nprocs; i++ ) {
         if ( 0 == proc_table[i].SWRUN_K_STAT )
@@ -304,21 +305,22 @@
        entry->hrSWRunPerfCPU += proc_table[i].kp_lwp.kl_iticks;
        entry->hrSWRunPerfMem  = proc_table[i].kp_vm_map_size / 1024;
 #elif defined(dragonfly)
-       entry->hrSWRunPerfCPU  = proc_table[i].kp_eproc.e_uticks;
-       entry->hrSWRunPerfCPU += proc_table[i].kp_eproc.e_sticks;
-       entry->hrSWRunPerfCPU += proc_table[i].kp_eproc.e_iticks;
+       entry->hrSWRunPerfCPU  = proc_table[i].p_uticks;
+       entry->hrSWRunPerfCPU += proc_table[i].p_sticks;
+       entry->hrSWRunPerfCPU += proc_table[i].p_iticks;
        entry->hrSWRunPerfMem  = proc_table[i].kp_vm_map_size / 1024;

 #else
         /*
          * early FreeBSD, NetBSD, OpenBSD
          */
-        entry->hrSWRunPerfCPU  = proc_table[i].kp_proc.p_uticks;
-        entry->hrSWRunPerfCPU += proc_table[i].kp_proc.p_sticks;
-        entry->hrSWRunPerfCPU += proc_table[i].kp_proc.p_iticks;
-        entry->hrSWRunPerfMem  = proc_table[i].kp_eproc.e_vm.vm_tsize;
-        entry->hrSWRunPerfMem += proc_table[i].kp_eproc.e_vm.vm_ssize;
-        entry->hrSWRunPerfMem += proc_table[i].kp_eproc.e_vm.vm_dsize;
+        entry->hrSWRunPerfCPU  = proc_table[i].p_uticks;
+        entry->hrSWRunPerfCPU += proc_table[i].p_sticks;
+        entry->hrSWRunPerfCPU += proc_table[i].p_iticks;
+        struct vmspace *l = proc_table[i].p_vmspace;
+        entry->hrSWRunPerfMem  = l->vm_tsize;
+        entry->hrSWRunPerfMem += l->vm_ssize;
+        entry->hrSWRunPerfMem += l->vm_dsize;
         entry->hrSWRunPerfMem *= (getpagesize() / 1024);
 #endif
     }

もちろん、この diff は真空のようにひどいので、明日改善します ;)

于 2012-09-04T23:42:28.923 に答える