Selasa, 16 Juni 2020

Processes and Signals


     Definisi proses: Ruang alamat; utas (program) yang berjalan di dalam ruang itu); diperlukan sumber daya sistem untuk utas tersebut.
Isi proses: kode program, data, variabel dalam memori sistem, file terbuka (deskriptor file), dan ruang lingkungan yang diisi dengan variabel lingkungan, dan penghitung programnya sendiri untuk melacak pernyataan yang dijalankan di setiap utasnya. (Linux sebenarnya membagikan satu salinan kode yang digunakan oleh lebih dari satu proses - seperti windows DLL.)
Sistem operasi menangani banyak proses yang tampaknya berjalan pada saat yang sama. ( banyak pengguna, banyak pekerjaan dari setiap pengguna, banyak proses sistem - semuanya sekaligus)
Lihat proses saya: (melihat tabel proses Linux)
PEPPER> ps –f (gunakan ps - ef untuk melihat semua proses sistem)
UID
PID
PPID
C
STIME
TTY
WAKTU
CMD
LADA
17154
17153
0
12:04
Poin / 1
00:00:00
-pesta
LADA
17277
17154
0
12:19
Poin / 1
00:00:00
ps –f
·          PID adalah pengidentifikasi proses
·          PPID adalah ID proses induk. (Lihat bagaimana bash saya meluncurkan ps saya)
·          C adalah persentase pemanfaatan CPU.
·          CMD adalah perintah yang digunakan untuk memulai proses
Hai    Lihat nilai proses dengan cd / proc / <id proses Anda>
  PEPPER> ps -ax | egrep ' PEPPER | PID | init '
PID
TTY
STAT
WAKTU
PERINTAH
1
?
Ss
0:04
/ sbin / init
17153
?
S
0:00
sshd : PEPPER @ pts / 1
17411
Poin / 1
S +
0:00
egrep PEPPER | PID

init - proses startup, induk dari semua yang lain
KODE STATUS PROSES
       Berikut adalah nilai yang berbeda yang akan ditampilkan oleh penspesifikasi s, stat dan status (tajuk "STAT" atau "S") untuk menggambarkan keadaan proses: dari http://askubuntu.com/questions/360252/what-do -the-stat-kolom-nilai-dalam-ps-rata
·          D     tidur tanpa gangguan (biasanya IO)
·          R     running atau runnable (on run antrian)
·          S     tidur interruptible (menunggu acara selesai)
·          T     berhenti, baik oleh sinyal kontrol pekerjaan atau karena sedang dilacak.
·          W     paging (tidak valid sejak kernel 2.6.xx)
·          X     mati (tidak boleh dilihat)
·          Z     mati ("zombie") proses, dihentikan tetapi tidak menuai oleh orang tuanya.
·          <     prioritas tinggi (tidak baik untuk pengguna lain)
·          N     prioritas rendah (baik untuk pengguna lain)
·          L.     memiliki halaman terkunci ke dalam memori (untuk real-time dan custom IO)
·          s     adalah pemimpin sesi
·          l     multi-threaded (menggunakan CLONE_THREAD, seperti NPTL pthreads do)
·          +     berada di grup proses latar depan.
Bagaimana Linux memutuskan siapa yang mendapatkan kutu waktu berapa lama?
·          Memiliki ukuran kebaikan. Lihat dengan ps –l
·          Program berperilaku baik yang tidak mem-cog cpu bagus, seperti yang kadang-kadang menunggu beberapa input.
·          Linux menyesuaikan nilai yang bagus, menunggu hadiah untuk input. Anda juga dapat secara paksa menetapkan nilai bagus untuk meningkatkan prioritas Anda.  
·          Semakin rendah angkanya, semakin tinggi prioritas.
Bagaimana Linux memulai login Anda:
·          fork - id proses baru
·          exec - ganti proses yang ada dengan program baru
https://www.washington.edu/R870/img/fork-exec.gif
·          gambar dari https://www.washington.edu/R870/img/fork-exec.gif
Memulai proses baru   dengan sistem - luncurkan proses shell yang meluncurkan proses lain
Gunakan sistem untuk Meluncurkan satu program dari dalam yang lain dan menunggu jawabannya. Pertama-tama membuat shell anak dan kemudian menjalankan program dari shell itu
gunakan sistem dari dalam stdlib.h
sistem int ( const char * string);
respon: 127 = shell tidak dapat dimulai untuk proses baru; -1 = kesalahan lainnya; kode lain: kode keluar dari perintah yang disebut.
Buat tidak menunggu dengan mengirimkan proses ke latar belakang.   
Contoh: wget http://home.adelphi.edu/~pe16132/csc271/note/scripts/fileio/process1.c
·          #termasuk < stdlib.h >
·          #termasuk < stdio.h >
·          int main ()
·          {
·          printf ("menjalankan ps dengan sistem \ n");
·          sistem (" ps ax &"); // kapan & mengirim ke latar belakang, selesai mencetak terlebih dahulu,
·                                         // hapus & untuk membuat cetakan terakhir
·          printf ("Selesai. \ n");
·          keluar (0);
·          }
Mengganti Gambar Proses dengan keluarga exec
Rangkaian perintah exec akan memberikan eksekusi dari satu program ke program lainnya. Ruang program peluncuran digantikan oleh program baru, menjaga deskriptor file terbuka dan beberapa pengaturan proses lainnya.
lebih efisien daripada perintah sistem
di dalam unistd.h
·          execl , exclp , execl3 - mengambil sejumlah variabel argumen yang diakhiri dengan pointer nol.
·          execv , execvp , execve - mengambil argumen kedua sebagai array dari string.
·          ending e- juga mengirimkan variabel lingkungan
·          ending p - cukup berikan file dan itu akan mencari jalan Anda
·          nilai kembali : hanya kembali dengan kesalahan karena proses sedang diganti. -1 adalah kesalahan.
Hai    Contoh panggilan: wget http://home.adelphi.edu/~pe16132/csc271/note/scripts/fileio/process2.c
§   #termasuk < unistd.h >
§   int main ( int argc , char * argv [])
§   {
§   // atur lingkungan yang akan digunakan untuk meneruskan ke perintah yang diakhiri dengan e
§   char * const ps_env [] = {"PATH = / bin: / usr / bin" "TERM = console", NULL};
§   execl ("/ bin / ps ", " ps ", " ax", NULL );
§   execlp (" ps ", " ps ", " ax", NULL );
§   mengeksekusi ("/ bin / ps ", " ps ", " ax", NULL , ps_env );
§   // asumsikan program disebut dengan parms " ps ", "ax", 0
§   execv ("/ bin / ps ", argv );
§   execvp (" ps ", argv );
§   mengeksekusi ("/ bin / ps ", argv , ps_env );
§   }
Gandakan Proses dari dalam Proses menggunakan garpu - dapat menunggu respons
Perintah fork akan menciptakan proses baru yang hampir identik dengan proses induk, mengeksekusi kode yang sama, tetapi dengan ruang data, lingkungan, dan deskriptor file sendiri.
prototipe fungsi : garpu pid_t (tidak valid)
kembali : ke orang tua itu mengembalikan proses id anak jika baik dan -1 jika kesalahan; untuk anak itu mengembalikan 0 (sehingga program Anda dapat menguji kode pengembalian garpu untuk menentukan apakah itu berjalan sebagai anak atau orang tua)
·          pid = fork ();
·          jika ( pid <= 0)
·          {    printf ("Kode anak sedang berjalan dengan respons fork dari% d \ n", pid );
·          }
·          lain
·          {    printf ("Kode induk berjalan dengan respons fork dari% d \ n", pid );
·          }
·          wget http://home.adelphi.edu/~pe16132/csc271/note/scripts/fileio/fork1.c
Orang tua dapat menunggu sampai anak bercabangnya selesai. Kemudian, ia juga dapat memeriksa status keluar anak.  
termasuk <sys / wait.h >
pid_t wait ( int * stat_loc ) - untuk setiap anak
pid_t waitpid ( pid_t pid , int * stat_loc , opsi int ) - untuk anak tertentu
kemungkinan tes nilai status memeriksa stat_val (hanya bilangan bulat):   dikreditkan ke http://www.unix.org/version2/sample/wait.html
WIFEXITED ( stat_val )
Mengevaluasi ke nilai bukan nol jika status dikembalikan untuk proses anak yang diakhiri secara normal.
WEXITSTATUS ( stat_val )
Jika nilai WIFEXITED ( stat_val ) adalah tidak nol, makro ini mengevaluasi ke 8 bit orde rendah dari argumen status bahwa proses anak dilewatkan ke _exit () atau keluar () , atau nilai proses anak yang dikembalikan dari main () .
WIFSIGNALED ( stat_val )
Mengevaluasi ke nilai bukan nol jika status dikembalikan untuk proses anak yang diakhiri karena penerimaan sinyal yang tidak ditangkap (lihat < signal.h > ).
WTERMSIG ( stat_val )
Jika nilai WIFSIGNALED ( stat_val ) adalah non-nol, makro ini mengevaluasi jumlah sinyal yang menyebabkan penghentian proses anak.
WIFSTOPPED ( stat_val )
Mengevaluasi ke nilai bukan nol jika status dikembalikan untuk proses anak yang saat ini dihentikan.
WSTOPSIG ( stat_val )
Jika nilai WIFSTOPPED ( stat_val ) adalah non-nol, makro ini mengevaluasi jumlah sinyal yang menyebabkan proses anak berhenti.
WIFCONTINUED ( stat_val )
Contoh: wget http://home.adelphi.edu/~pe16132/csc271/note/scripts/fileio/fork1a.c
·          #termasuk <sys / types.h >
·          #termasuk < unistd.h >
·          #termasuk < stdio.h >
·          #termasuk < stdlib.h >
·          #termasuk <sys / wait.h >
·          int main ()
·          {
·          int stat_val ;
·          pid_t   pid ;
·          pid_t finished_pid ;
·          pesan char *;
·          int n;
·          printf ("program garpu dimulai \ n");
·          pid = fork ();
·          if ( pid > 0 || pid == -1) // induk
·          {
·          finished_pid = tunggu (& stat_val );
·          printf ("Kode induk berjalan dengan respons fork dari% d \ n", pid );
·          printf (" Pid anak% d selesai sekarang \ n", finished_pid );
·          if (WIFEXITED ( stat_val ))
·          { printf ("child keluar dengan kode% d \ n", WEXITSTATUS ( stat_val ));
·          sistem (" ps -u PEPPER");
·          }
·          }
·          lain // anak
·          {    printf ("Kode anak sedang berjalan dengan respons fork dari% d \ n", pid );
·          tidur (15);
·          sistem (" ps -u PEPPER");
·          keluar (37);
·          }
·          keluar (0);
·          }
Hasil Program di:
·          program garpu dimulai
·          Kode anak dijalankan dengan respons fork 0
·          Hasil PS dengan kedua proses
·          Kode induk berjalan dengan respons fork 17962
·          Anak pid 17962 selesai sekarang
·          anak keluar dengan kode 37
·          hasil ps tanpa 17962
Proses Zombie
Anak bercabang yang sudah selesai tetapi menunggu orang tua untuk keluar. Itu membuat entri dalam tabel proses dengan kode kembali jika orangtua ingin memanggil tunggu.   ps menunjukkan anak yang lengkap dengan <defunct> a
·          Akhiri orang tua
·          Panggilan tunggu
Menangani sinyal yang diterima proses Anda menggunakan sinyal
Nama sinyal didefinisikan di dalam signal.h
beberapa di antaranya: dari http://unixhelp.ed.ac.uk/CGI/man-cgi?signal+7
         Sinyal         Nilai        Tindakan      Komentar 
         -------------------------------------------------- ----------------------- 
         PENJUALAN            1          Istilah       Hangup terdeteksi pada terminal kontrol 
                                atau kematian proses pengendalian 
         SIGINT            2          Istilah       Ganggu dari keyboard 
         SIGQUIT           3          Inti       Keluar dari keyboard 
         SIGILL            4          Inti       Instruksi Ilegal 
         SIGABRT           6          Inti       Batalkan sinyal dari batalkan ( 3) 
         SIGFPE            8          Inti       Pengecualian titik apung 
         SIGKILL           9          Istilah       Bunuh sinyalnya 
         SIGSEGV          11          Inti       Referensi memori tidak valid 
         SIGPIPE          13          Istilah       Pipa rusak: tulis ke pipa tanpa pembaca 
         SIGALRM          14          Istilah       Sinyal pengatur waktu dari alarm ( 2) 
         SIGTERM          15          Istilah       Sinyal terminasi 
         SIGUSR1      30 , 10,16       Istilah       Sinyal yang ditentukan pengguna 1 
         SIGUSR2      31 , 12,17       Istilah       Sinyal yang ditentukan pengguna 2 
         SIGCHLD      20 , 17,18       Ign        Anak berhenti atau dihentikan 
         SIGCONT      19 , 18,25       Lanj       Lanjutkan jika berhenti 
         SIGSTOP      17 , 19,23       Berhenti       Hentikan proses 
         SIGTSTP      18 , 20,24       Berhenti       Berhenti mengetik di tty 
         SIGTTIN      21 , 21,26       Berhenti       masukan tty untuk proses latar belakang 
         SIGTTOU      22 , 22,27       Berhenti       tty output untuk proses latar belakang 
         Itu     sinyal SIGKILL dan SIGSTOP tidak dapat ditangkap, diblokir, atau diabaikan. 
  Jika suatu proses menerima sinyal tanpa mengatur untuk menangkapnya, itu akan mati dengan dump inti. 
  SIGCHLD diabaikan secara default 
 
   CTRL C mengirimkan SIGINT ke proses foreground. 
  Untuk membunuh proses lain : kill –HUP 999 (akan mengirim SIGHUP ke proses itu 999) 
  Program yang menangani sinyal menggunakan perintah sinyal: 
  void (* signal ( int sig, void (* func ) ( int ))) ( int ); 
  Catatan : program lama menggunakan ini, tetapi sigaction lebih baik. 
  ·             sinyal membutuhkan 2 parm , sig dan func . 
  ·             sinyal untuk ditangkap adalah tanda 
  ·             berfungsi untuk memanggil ketika sinyal diterima berfungsi 
  ·             func harus menerima satu argumen int , yang merupakan sinyal dan tidak mengembalikan apa pun. 
  ·             Contoh: wget http://home.adelphi.edu/~pe16132/csc271/note/scripts/fileio/ctrlc1.c 
  Hai      #termasuk < signal.h > 
  Hai      #termasuk < stdio.h > 
  Hai      #termasuk < unistd.h > 
  Hai    
  Hai      batal aduh ( int sig) 
  Hai      { 
  Hai          printf ( "OUCH! - Saya mendapat sinyal% d \ n", sig); 
  Hai          sinyal (kosong) (SIGINT, SIG_DFL);  // kembalikan standar 
  Hai      } 
  Hai    
  Hai      / *     Fungsi utama harus mencegat sinyal SIGINT yang dihasilkan ketika kita mengetik Ctrl-C. 
  Hai          Untuk sisa waktu, itu hanya duduk dalam satu lingkaran tak terbatas, 
  Hai          mencetak pesan satu detik sekali.     * / 
  Hai    
  Hai      int main () 
  Hai      { 
  Hai          sinyal (kosong) (SIGINT, aduh);  // mengatur fungsi penangkap sinyal 
  Hai    
  Hai          sementara (1) { 
  Hai              printf ("Hello World! \ n"); 
  Hai              tidur (1); 
  Hai          } 
  Hai      } 
  Mengirim Sinyal: 
  Untuk mengirim sinyal ke suatu proses: int kill ( pid_ t     pid , int sig);  (tetapi tidak harus dibunuh) 
  Untuk mengirim alarm secara berkala ke proses Anda sendiri: alarm int unsigned ( unsigned int seconds); 
   Untuk menunggu sinyal diterima: int pause ( void); 
    Contoh: wget http://home.adelphi.edu/~pe16132/csc271/note/scripts/fileio/alarm.c 
  / *     Di alarm.c , fungsi pertama, ding, mensimulasikan jam alarm.     * / 
  #termasuk < signal.h > 
  #termasuk < stdio.h > 
  #termasuk < unistd.h > 
  #termasuk < stdlib.h > 
  static int alarm_fired = 0; 
  membatalkan ding ( int sig) 
  { 
      alarm_fired = 1; 
  } 
  / *     Secara utama, kami memberi tahu proses anak untuk menunggu selama lima detik 
      sebelum mengirim sinyal SIGALRM ke induknya.     * / 
  int main () 
  { 
      pid_t pid ; 
      printf ( "aplikasi alarm dimulai \ n"); 
      pid = fork (); 
      beralih ( pid ) { 
      kasus -1: 
        / * Kegagalan * / 
        perror ( "garpu gagal"); 
        keluar ( 1); 
      case 0: 
        / * anak * / 
          tidur ( 5); 
          bunuh ( getppid (), SIGALRM); 
          keluar ( 0); 
      } 
  / *     Proses induk mengatur untuk menangkap SIGALRM dengan panggilan ke sinyal 
      dan kemudian menunggu yang tak terhindarkan.     * / 
      printf ( "menunggu alarm mati \ n"); 
      ( tidak berlaku ) sinyal (SIGALRM, ding); 
      jeda ( ); 
      jika ( alarm_fired ) 
          printf ( "Ding! \ n"); 
      printf ( "selesai \ n"); 
      keluar ( 0); 
  } 
  Menangani Sinyal menggunakan sigaction fungsi yang lebih kuat: 
  perintah sigaction mengisi struktur sigaction : 
  int sigaction ( int sig, sigaction const struct * act, sigaction struct * oact ); 
  ·             mengandung: 
  ·             sa_handler - fungsi untuk menangani sinyal atau SIG_DFL (default) atau SIG_IGN (abaikan) 
  ·             sa_mask - sinyal untuk diblokir di sa_handler 
  ·             sa_flags - pengubah aksi sinyal 
  Pengembalian: 
  ·             0 jika berhasil 
  ·             -1 jika tidak berhasil 
        Contoh (program kontrol c yang sama tetapi menggunakan sigaction )   
  wget http://home.adelphi.edu/~pe16132/csc271/note/scripts/fileio/ctrlc2.c 
  ·             #termasuk < signal.h > 
  ·             #termasuk < stdio.h > 
  ·             #termasuk < unistd.h > 
  ·             batal aduh ( int sig) 
  ·             { 
  ·             printf ( "OUCH! - Saya mendapat sinyal% d \ n", sig); 
  ·             } 
  ·             int main () 
  ·             { 
  ·             tindakan sigaction struct ; 
  ·             act.sa_handler = aduh; 
  ·             sigemptyset (& act.sa_mask ); 
  ·             act.sa_flags = 0; 
  ·             sigaction (SIGINT, & act, 0); 
  ·             sementara (1) { 
  ·             printf ("Hello World! \ n"); 
  ·             tidur (1); 
  ·             } 
  ·             }  
 
 
Terimakasih sudah membaca:)

Tidak ada komentar:

Posting Komentar