الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]إرسال إشارة ( STOP ) من العملية لنفسها !

بدأه حنين ، في 16 نوفمبر 2012 · 6 رد · 909 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

المطلوب كود يرسل إشارة STOP من العملية لنفسها

استخدمت الدالة ()kill ولكني أحس مكانها مو صح !

هذا الكود ياليت تساعدوني

مستعجلة جداً :/

#include<stdio.h>
#include <unistd.h>     /* standard unix functions, like getpid()       */
#include <sys/types.h>  /* various type definitions, like pid_t         */
#include <signal.h>     /* signal name macros, and the kill() prototype */

/* first, find my own process ID */
pid_t my_pid = getpid();

/* now that i got my PID, send myself the STOP signal. */
kill(my_pid, SIGSTOP);

void sig_handler(int signo)
{
        printf("received SIGSTOP\n");
}

int main(void)
{

    if (signal(SIGSTOP, sig_handler) == SIG_ERR)
        printf("\ncan't catch SIGSTOP\n");
    // A long long wait so that we can easily issue a signal to this process
    while(1) 
        sleep(1);
    return 0;
}

تم تعديل هذه المشاركة بواسطة حنين ، في 16 نوفمبر 2012 في 05:06

#2

لاتستطيعين إستدعاء دالة من خارج دالة. هذا تعديل على البرنامج لم أختبره:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

void sig_handler(int signo)
{
    printf("received SIGSTOP\n");
}

int main(int argc, char **argv)
{
    unsigned int i = 0;
    pid_t pid = getpid();

    if( signal(SIGSTOP, sig_handler) == SIG_ERR ) {
        perror("Error");
        return -1;
    }

    while(1) {
        if( i++ == 5 )
            kill(pid, SIGSTOP);
        else
            sleep(1);
    }

    return 0;
}
1
#3

Mr.B

جزاك الله خير على سرعة ردك ، لكن يظهر لي عند تشغيل البرنامج (Invalid argument)

مالخطأ :/ !

#4

كتبت هذا الكود ، ولا أعلم هل يقوم بالعملية بشكل صحيح :/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

int main()
{

pid_t pid = getpid();

kill(pid, SIGSTOP);

return 0;
}

ظهرت لي المخرجات بالشكل التالي :

عند أول تشغيل للكود

[1]+ stopped             ./a.out

عند ثاني تشغيل للكود

[2]+ stopped             ./a.out

وهكذا في كل مرة يتغير الرقم ..

أفيدوني جزاكم الله خير

تم تعديل هذه المشاركة بواسطة حنين ، في 16 نوفمبر 2012 في 19:52

#5

لم أجرب البرنامج في البداية, سبب ظهور الرسالة أن الإشارة SIGSTOP وSIGKILL لايمكن إعتراضهما signal(2) - Linux manual page:

اقتباس
The signals SIGKILL and SIGSTOP cannot be caught or ignored.

ممكن تجربين ترسلين رسالة أخرى وتعترضينها مثل رسالة SIGINT التي يرسلها النظام للبرنامج عند الضغط على الزرين Ctrl-C :

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

void sig_handler(int signo)
{
    printf("Ctrl-C has been hit\n");
    exit(0);
}

int main(int argc, char **argv)
{
    unsigned int i = 0;
    pid_t pid = getpid();

    if( signal(SIGINT, sig_handler) == SIG_ERR ) {
        perror("Error");
        return -1;
    }

    while(1) {
        if( i++ == 5 ) {
            kill(pid, SIGINT);
        }
        else {
            sleep(1);
            printf("Sleep zZzZzZz\n");
        }
    }

    return 0;
}

يمكنك جعل البرنامج يرسل SIGSTOP لنفسه لكن كما ذكرت لن يسمح لك النظام بإعتراضها:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

int main(int argc, char **argv)
{
    unsigned int i = 0;
    pid_t pid = getpid();

    while(1) {
        if( i++ == 5 ) {
            kill(pid, SIGSTOP);
        }
        else {
            sleep(1);
            printf("Sleep zZzZzZz\n");
        }
    }

    return 0;
}
1
#6
حنين ، كتب:

كتبت هذا الكود ، ولا أعلم هل يقوم بالعملية بشكل صحيح :/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

int main()
{

pid_t pid = getpid();

kill(pid, SIGSTOP);

return 0;
}

ظهرت لي المخرجات بالشكل التالي :

عند أول تشغيل للكود

[1]+ stopped             ./a.out

عند ثاني تشغيل للكود

[2]+ stopped             ./a.out

وهكذا في كل مرة يتغير الرقم ..

أفيدوني جزاكم الله خير

برنامجهذا صحيح, الآن لو تكتبين بسطر الأوامر :

ps aux | grep a.out | grep -v grep

ستجدين عمليتين "متوقفة"، وهذه وظيفية الإشارة SIGSTOP. لجعلها تكمل إكتبي:

killall -CONT a.out

ولإنهاء العملية:

killall -9 a.out
1
#7

الله يسعدك ويفرج همك ويريح بالك

ضبط الحمد لله

شكرا

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…