Rumah  >  Artikel  >  Tutorial sistem  >  Menganalisis Saint Penaung Linux

Menganalisis Saint Penaung Linux

PHPz
PHPzke hadapan
2024-04-29 12:28:13497semak imbas
Perbezaan antara proses latar belakang dan proses daemon
    Perbezaan terbesar adalah seperti berikut:
  • (a) Proses daemon telah dipisahkan sepenuhnya daripada konsol terminal, tetapi program latar belakang belum sepenuhnya dipisahkan daripada terminal (hasilnya masih akan dikeluarkan ke terminal sebelum terminal ditutup);
  • (b) Proses daemon tidak akan terjejas apabila menutup konsol terminal, tetapi program latar belakang akan berhenti apabila pengguna keluar Ia perlu dijalankan dalam arahan & format nohup untuk mengelakkan kesan;
  • (c) Kumpulan sesi, direktori semasa dan deskriptor fail proses daemon adalah bebas. Berjalan di latar belakang hanyalah garpu terminal untuk membolehkan program dilaksanakan di latar belakang

Menganalisis Saint Penaung Linux

Ciri daemon
Daemon ialah proses khas yang berjalan di latar belakang Ia dipisahkan daripada terminal, sekali gus menghalang proses daripada diganggu oleh isyarat yang dihasilkan oleh mana-mana terminal, dan maklumat yang dijana semasa pelaksanaan proses tidak dipaparkan pada mana-mana terminal. . Proses daemon secara berkala melaksanakan tugas tertentu atau menunggu untuk pemprosesan peristiwa tertentu yang berlaku Kebanyakan pelayan di Linux dilaksanakan menggunakan proses daemon.

Isi utama pengaturcaraan daemon
    1. Melindungi beberapa isyarat yang berkaitan dengan operasi terminal kawalan adalah untuk mengelakkan terminal kawalan daripada terganggu dan keluar atau tergantung sebelum proses daemon dimulakan seperti biasa. kod tunjukkan seperti di bawah:
      /* 处理可能的终端信号 */
      signal(SIGTTOU, SIG_IGN);
      signal(SIGTTIN, SIG_IGN);
      signal(SIGTSTP, SIG_IGN);
      signal(SIGHUP , SIG_IGN);
      
    2. Lari di latar belakang.
      /* 是父进程,结束父进程,子进程继续 */
      if(fork())
          exit(0);
      
    3. Keluar daripada kawalan kumpulan terminal dan proses:
      • (1) Sesuatu proses tergolong dalam kumpulan proses, dan nombor kumpulan proses (PGID) ialah nombor proses (PID) ketua proses
      • (2) Proses dalam kumpulan proses yang sama berkongsi terminal kawalan Secara lalai, terminal kawalan ini ialah terminal tempat proses dibuat
      • (3) Terminal kawalan dan kumpulan proses yang dikaitkan dengan proses biasanya diwarisi daripada proses induk Oleh itu, proses anak masih dipengaruhi oleh terminal proses induk, kerana isyarat yang dihasilkan oleh terminal akan dihantar kepada semua. proses dalam kumpulan proses latar depan.
      Berdasarkan sebab-sebab di atas, adalah perlu untuk menyingkirkan sepenuhnya pengaruh terminal untuk proses anak Ia perlu memanggil setsid() untuk menjadikan anak memproses ketua sesi yang baru:

      setsid();
      Selepas panggilan setsid() berjaya, proses memanggil fungsi ini menjadi ketua sesi baharu dan ketua proses baharu, dan diputuskan sambungan daripada kumpulan proses asal. Disebabkan oleh eksklusiviti proses sesi ke terminal kawalan, proses itu dipisahkan daripada terminal kawalan pada masa yang sama.

    4. Untuk melarang proses membuka semula terminal kawalan, kaedah yang diguna pakai ialah mencipta proses anak semula dan membiarkan proses ibu bapa keluar Proses anak bukan lagi ketua sesi, sekali gus mencapai matlamat. kod tunjukkan seperti di bawah:
      /* 结束第一子进程,第二子进程继续 */
      if(fork())
          exit(0);
      
    5. Tutup buka deskriptor fail. Oleh kerana proses mewarisi deskriptor fail terbuka daripada proses induk yang menciptanya, ia secara amnya tidak diperlukan lagi. Jika ia tidak ditutup, sumber sistem akan dibazirkan. kod tunjukkan seperti di bawah:
      #define NOFILE  256
      
      for(i=0; i
    6. Tukar direktori kerja semasa. Semasa proses aktif, sistem fail yang mengandungi direktori kerjanya tidak boleh dinyahlekap. Oleh itu, anda perlu menukar direktori kerja daemon kepada direktori yang sesuai. kod tunjukkan seperti di bawah:
      chdir("/tmp");
    7. Tetapkan semula topeng penciptaan fail. Satu proses mewarisi topeng penciptaan fail daripada proses induk yang menciptanya. Ia boleh mengubah suai kebenaran akses fail yang dibuat oleh daemon. kod tunjukkan seperti di bawah:
      umask(0);
      
    8. Kendalikan isyarat SIGCHLD (isyarat keluar proses kanak-kanak). Jika anda tidak menunggu proses anak tamat, proses anak akan menjadi proses zombi dan menduduki sumber kernel sistem.
      /* 将子进程退出信号设为SIG_IGN,让系统帮助回收进程资源 */
      signal(SIGCHLD, SIG_IGN);
    9. Kod keseluruhan adalah seperti berikut:

      #define NOFILE      256
      
      void DaemonMode()
      {
          int num = 0;
          int fd0, fd1, fd2;
      
          /* 屏蔽可能的信号 */
          signal(SIGTTOU, SIG_IGN);
          signal(SIGTTIN, SIG_IGN);
          signal(SIGTSTP, SIG_IGN);
          signal(SIGHUP , SIG_IGN);
      
          if(fork())
              exit(0);
      
          setsid();
      
          if(fork())
              exit(0);
      
          chdir("/tmp/httpd");
      
          umask(0);
      
          for(; num

Tambah setsid() fungsi fungsi:
Jika proses panggilan sudah menjadi ketua kumpulan proses, fungsi ini mengembalikan ralat. Untuk mengelakkan keadaan ini, fork() biasanya dipanggil untuk mencipta proses anak, dan kemudian proses induknya ditamatkan, sementara proses anak diteruskan, dan fungsi ini dipanggil dalam proses anak.

Jika proses memanggil fungsi ini bukan ketua kumpulan proses, fungsi ini akan mencipta sesi baharu, dan proses memanggil fungsi setsid() akan menjadi proses ketua sesi baharu dan akan diasingkan daripada kumpulan sesi dan proses kumpulan proses induknya. Oleh kerana sesi itu eksklusif kepada terminal kawalan, proses tersebut dipisahkan secara serentak daripada terminal kawalan.

Atas ialah kandungan terperinci Menganalisis Saint Penaung Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:linuxprobe.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam