を設定しているとき、私はpthread_setname_np()機能が
g++ -pthread example.cpp
で男pthread_setname_npからサンプルプログラムをコンパイルし、私は私のプログラムはa.outのcap_net_raw機能を設定します。
sudo setcap 'cap_net_raw=+eip' a.out
実行するときに驚くべきことに、プログラムが失敗します。私が追加したときに、私は以下の権限を持っているよう
$./a.out
Created a thread. Default name is: a.out
pthread_setname_np: Permission denied
を、私はそれが動作する機能を削除すると...
$sudo setcap 'cap_net_raw=-eip' a.out
$./a.out
Created a thread. Default name is: a.out
The thread name after setting it is THREADFOO.
Done
だから私のために見えます能力。誰でもこれを説明できますか?あなたの応答のための
Thankyます;-)
いくつかの追加情報:
- 機能が私の目標でサポートされている私は、pingコマンドでそれをチェックしCAP_NET_RAW
- カーネル4.4.32-rt43
- RFS:ext4
- 私はこのプログラムに投稿を減らしました。このプログラムにCAP_NET_RAWを追加することは意味がありません。
- CAP_DAC_OVERRIDEを追加するとうまくいくが、それは避けたい。
答えはフロリアンです。 また、pthread_setname_npは、プログラムが実行されているスレッドでない場合、/ proc/PID/commに書き込もうとします。 解決策として私に何をお勧めしますか?/proc/self/task/TID/comm ..に直接書くのは簡単ですか?だから、私自身のpthread_setname関数を書きます。 – gees
私の最終的な解決策では、pthread_createで呼び出された関数にパラメータとしてスレッド名を与え、この関数を呼び出してpthread_setname_npという名前を設定します。名前の設定はフロリアンの説明どおりに自分のスレッドでのみ許可されるためです。 – gees