ابحث عن PID للعملية حسب الاسم دون استخدام popen() أو system()

StackOverflow https://stackoverflow.com/questions/374997

  •  22-08-2019
  •  | 
  •  

سؤال

لدي اسم العملية ويجب أن أرسل kill() قم بالإشارة إلى هذه العملية ولكني بحاجة إلى الاتصال بمعرف PID الخاص بها kill().أود فقط استخدام:

popen("pidof process_name");

كآخر شيء.هل هناك أي طريقة أخرى لمعرفة PID للعملية؟إحدى الطرق التي يمكنني التفكير فيها هي إرسال طلب مأخذ توصيل إلى تلك العملية والسؤال عن معرف المنتج (PID) الخاص بها.

الطريقة الأخرى معقدة بعض الشيء بالنسبة للكود البسيط الذي أكتبه:لفعل ماذا الكود المصدري لأمر pidof يفعله بالفعل (يستخدم استدعاء دالة find_pid_by_name() ولكن هذا يفعل الكثير من الأشياء).

إذا لم يكن هناك حل بسيط ممكن، يجب أن أفعل هذا:

system("pkill <process_name>");

والتحقق من رمز الإرجاع الخاص به.ولكن هل سيكون pkill متاحًا بالتأكيد على جميع أجهزة Linux؟

هل كانت مفيدة؟

المحلول

ولقد ذكرت كنت تستخدم لينكس. وليست هذه هي أنظف الحل، ولكن يمكنك الذهاب من خلال كل دخول في / إجراءات والتحقق من اسم العملية في cmdline على ما كنت أبحث عنه.

نصائح أخرى

استخدم sysctl - <وأ href = "http://programming-in-linux.blogspot.com/2008/03/get-process-id-by-name-in-c.html" يختلط = "نوفولو noreferrer "> كود مثال

وتحرير - كان متوفرا في لينكس نرى هنا

وProcfs يقرأ ورخيصة جدا، وكثير من الناس يعتقدون بالتكرار عبر / إجراءات كما لو كانت بالتكرار عبر /، في الحقيقة ليست كذلك على الإطلاق.

وانقاذ بعض الوقت عن طريق تخطي أي إدخال الذي هو قيد 1000، لم يكن هناك شعور في دراسة المواضيع النواة. لذلك، أساسا .. بعد opendir ()، إذا strtoint () يعتقد أن الدخول هو عدد صحيح، وأن كثافة أكبر من أو يساوي 1000، مجرد قراءة / إجراءات /٪ د / القانون الأساسي.

وفي محاولة لتجنب الرغبة في حل عادل وصلة "إكس"، لأن ذلك لن اقول لكم حالة عملية من شأنها أن تلقي إشارة. على سبيل المثال، إذا كان الهدف هو في ولاية 'D' (النوم القرص)، وكنت تريد أن تعرف باسم إشارة لن يتم تسليم فورا، أو ربما أبدا، إذا كانت الدولة هي D الدائمة.

في معظم النظم، وهناك سيكون 70 - 120 عمليات لدراسة وعليك غالبا ما تجد طريقة التي تستهدفها قبل الوصول إلى نهاية

ولقد ذكرتم، "طريقة واحدة كنت أفكر فيه هو لتقوم بإرسال طلب مقبس لتلك العملية واطلب PID لها." هذا يبدو وكأنه عملية تحاول قتل هو برنامج كتبته.

إذا كان هذا هو الحال، والشيء cannonical القيام به هو تخزين معرف المنتج في ملف (عادة تحت / فار / المدى، إذا كان لديك الوصول إليها) في حين أن البرنامج قيد التشغيل، وإزالة الملف عند إنهاء البرنامج . وبهذه الطريقة، كشف عن وجود أو عدم تشغيل البرنامج بسيطة مثل

if kill -0 $(cat /var/run/myprog.pid 2>/dev/null) 2>/dev/null; then
    echo Running!
else
    rm -f /var/run/myprog.pid
    echo "Not running."
end

ودراسة متأنية من جميع الآثار المترتبة على رمز أعلاه من المحتمل أن يعلمك الكثير عن كيفية عمل ملفات PID. أو يمكنك أن تطلب فقط للحصول على شرح أكثر تفصيلا.

ويبدو أن هذا العمل غرامة بالنسبة لي.

وقد ترغب في إعطاء المسار الكامل للعملية الرغم من ذلك، لئلا يقتل العملية التي لها اسم مشابه.

ووالميزة الرئيسية لهذا هو أنه يمكنك تحديد إشارة إلى أن الذي تريد إرساله.

system("killall -s 9 process_name");

لماذا لا تستخدم fcntl مع F_GETOWN؟

لإكمال إجابات @GregRogers، ما عليك سوى التحقق من تنفيذ pidof

كما ترون فإنه يبحث فقط في دليل /proc.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top