0

私のLinuxシステムには、非常に早い段階で(起動中に)起動するデーモンがあります。起動中のデーモンは、g_dbus 名を初期化しているだけです。具体的には :

        guint id = g_bus_own_name ( G_BUS_TYPE_SESSION,
                            DBUS_NAME,
                            G_BUS_NAME_OWNER_FLAGS_NONE,
                            bus_acquired_handler,
                            name_acquired_handler,
                            name_lost_handler,
                            NULL,
                            NULL);

しかし、驚いたことに、私はいつもこれを取得します:

        ##### deliver signal SIG : 9, [BT]<Process Name>#1(679) get_signal_to_deliver
        ##### deliver signal SIG : 9, [BT]<Process Name>#2(681) get_signal_to_deliver

私もこれを試しました:

        dmesg | grep -i 'killed process'

しかし、問題は、どういうわけか、dmesg が空であることです。(これは意図的にやっていると思います)

プロセスでグローバル変数と静的変数もチェックしましたが、割り当てている大きなメモリはありません。さらに、メモリリークもありません

私のプロセスにもシステムのルート権限があるため、これも問題ではありません。

最後のポイント。(このデーモンの)systemdから2回かそこらの自動再起動の後、まったく問題はありません。

この振る舞いを理解するのに役立つ人はいますか? 直せるように。

4

1 に答える 1

0

問題を解決しました。私はこのテーマの専門家ではありませんが、これが私がどのように解決し、何が起こっているのかという結論を与えてくれました.

最初に解決策を示し、次に推論を試みます。

システム バスが起動しているかどうかを確認します。

          while(conn==NULL) {
             dbus_bus_get(DBUS_BUS_SYSTEM,&err);
             if(dbus_error_is_set(&err)){
                 usleep(1000*50);
              }

その後、システムバスを取得するだけです:

    guint id = g_bus_own_name ( G_BUS_TYPE_SYSTEM,
                        DBUS_NAME,
                        G_BUS_NAME_OWNER_FLAGS_NONE,
                        bus_acquired_handler,
                        name_acquired_handler,
                        name_lost_handler,
                        NULL,
                        NULL);                    

現在、信号はなく、デーモンはスムーズに動作します。

今理由。以前にセッションバスを取得しようとしていたのですが、起動時に作成されなかったため、カーネルがプロセスにシグナル 9 を送信していたと思います。ということで、セッションバスよりもかなり早い段階でローンチされるシステムバスに移行しました。さらに、システムバスを取得する前に、system_bus も稼働していることを確認する必要があるため、解決策になります。

どのプロセスが sigkill を送信しているかを答えると、特にプロセスはないように思えます。それはカーネル自体から来ていました。

これが他の誰かにも役立つことを願っています。

于 2015-02-12T04:03:46.327 に答える