Daemon'lar, doğrudan kullanıcının kontrolü altında çalışmayan ancak arka planda hizmet veren işlemlerdir. Genellikle sistem başlangıcında başlarlar ve sistem kapanana kadar sürekli çalışırlar. Bunların normal işlemlerden tek farkı konsola veya ekrana hiçbir şekilde mesaj göndermemeleridir.

Bir Linux makinesinde nasıl bir arka plan programı oluşturabileceğiniz aşağıda açıklanmıştır.

Daemon'ların Nasıl Oluşturulduğuna Kısa Bir Giriş

Sistemde çok sayıda arka plan programı çalışır ve bazı tanıdık arka plan programı örnekleri aşağıdaki gibidir:

  • crond: Komutların belirtilen zamanda çalışmasını sağlar
  • sshd: Uzak makinelerden sisteme giriş yapılmasını sağlar
  • httpd: Web sayfalarına hizmet eder
  • nfsd: Ağ üzerinden dosya paylaşımına izin verir

Ayrıca, arka plan programı süreçleri genellikle harfle sona erecek şekilde adlandırılır. d, zorunlu olmasa da.

Bir işlemin arka plan programı olarak çalışması için aşağıdaki yol izlenir:

  • Konfigürasyon dosyalarını okumak veya gerekli sistem kaynaklarını elde etmek gibi ilk işlemler, süreç bir arka plan programı haline gelmeden önce gerçekleştirilmelidir. Bu sayede sistem alınan hataları kullanıcıya bildirebilir ve uygun bir hata kodu ile işlem sonlandırılır.
    instagram viewer
  • Üst süreç olarak init ile arka planda çalışan bir süreç oluşturulur. Bu amaçla ilk olarak init sürecinden bir alt süreç çatallanır ve daha sonra çıkış ile üst süreç sonlandırılır.
  • Setsid işlevi çağrılarak yeni bir oturum açılmalı ve işlemin terminalden bağlantısı kesilmelidir.
  • Üst süreçten devralınan tüm açık dosya tanımlayıcıları kapatılır.
  • Standart giriş, çıkışve hata mesajları şu adrese yönlendirilir: /dev/null.
  • Sürecin çalışma dizini değişmelidir.

Daemon Oturumları Nelerdir?

Kullanıcılar bir terminal üzerinden sisteme giriş yaptıktan sonra kabuk programı üzerinden birçok uygulamayı çalıştırabilmektedir. Kullanıcı sistemden çıktığında bu işlemler kapanmalıdır. İşletim sistemi bu süreçleri oturum ve süreç grupları olarak gruplandırır.

Her oturum süreç gruplarından oluşur. Bu durumu şu şekilde tanımlayabilirsiniz:

Proseslerin girdilerini alıp çıktılarını gönderdiği terminale kontrol terminali denir. Bir kontrol terminali, aynı anda yalnızca bir oturumla ilişkilendirilir.

Bir oturum ve içindeki süreç gruplarının kimlik (ID) numaraları vardır; bu tanımlama numaraları, oturumun ve süreç grup liderlerinin süreç tanımlama numaralarıdır (PID). Bir alt süreç, üst süreciyle aynı grubu paylaşır. Birden fazla işlem yapıldığında boru mekanizması ile iletişim, ilk süreç süreç grup lideri olur.

Linux'ta Daemon Süreci Oluşturma

Burada bir arka plan programı işlevini nasıl oluşturabileceğinizi göreceksiniz. Bu amaçla, adlı bir işlev oluşturacaksınız. _daemon. Daemon olarak çalışacak uygulama kodunu şu şekilde adlandırarak başlayabilirsiniz: test.c, ve arka plan programı olarak oluşturacağınız kod daemon.c.

//test.c
#Dahil etmek <stdio.h>
int_daemon(int, int);
intana()
{
getchar();
_daemon (0, 0);
getchar();
dönüş0;
}
//daemon.c
#Dahil etmek <sys/types.h>
#Dahil etmek <sys/stat.h>
#Dahil etmek <stdlib.h>
#Dahil etmek <stdio.h>
#Dahil etmek <fcntl.h>
#Dahil etmek <unistd.h>
#Dahil etmek <linux/fs.h>
#Dahil etmek <linux/limits.h>
int_daemon(int nochdir, int kapalı){
pid_t pid;
pid = çatal(); // Üst süreci çatalla
eğer (pid < 0) {
çıkış(EXIT_FAILURE);
}
eğer (pid > 0) {
çıkış(EXIT_SUCCESS);
}
dönüş0;
}

Bir arka plan programı oluşturmak için, üst süreci init olan bir arka plan sürecine ihtiyacınız vardır. Yukarıdaki kodda, _daemon bir alt süreç oluşturur ve ardından üst süreci öldürür. Bu durumda, yeni işleminiz init'in bir alt işlemi olacak ve arka planda çalışmaya devam edecektir.

Şimdi uygulamayı aşağıdaki komutla derleyin ve işlemin öncesi ve sonrası durumunu inceleyin _deamon denir:

gccÖlçekÖlçek.carka plan programı.c

Uygulamayı çalıştırın ve başka bir tuşa basmadan farklı bir terminale geçin:

./Ölçek

İşleminizle ilgili değerlerin aşağıdaki gibi olduğunu görebilirsiniz. Burada, kullanmanız gerekecek süreçle ilgili bilgileri almak için ps komutu. Bu durumda, _daemon işlev henüz çağrılmadı.

ps -C Ölçek -o "pid ppid pgid sid tty durumemretmek"
# Çıktı
PID PPID PGID SID TT STAT KOMUTU
10296 5119 10296 5117 puan/2 S+ ./Ölçek

baktığınızda STAT alanında, işleminizin çalıştığını ancak ön planda çalışmasına neden olacak program dışı bir olayın gerçekleşmesini beklediğini görüyorsunuz.

Kısaltma Anlam
S Bir olayın olmasını uykuda beklemek
T Uygulama durduruldu
s Oturum lideri
+ Uygulama ön planda çalışıyor

Uygulamanızın ana işleminin beklendiği gibi kabuk olduğunu görebilirsiniz.

ps -jp 5119 
# Çıktı
PID PGID SID TTY TIME CMD
5119 5119 5117 puan/2 00:00:02 zsh

Şimdi uygulamanızı çalıştırdığınız terminale dönün ve Giriş çağırmak için _daemon işlev. Ardından diğer terminaldeki işlem bilgilerine tekrar bakın.

ps -C Ölçek -o "pid ppid pgid sid tty durumemretmek"
# Çıktı
PID PPID PGID SID TT STAT KOMUTU
22504 1 22481 5117 puan/2 S ./Ölçek

Öncelikle yeni alt işlemi görmediğiniz için arka planda çalışıyor diyebilirsiniz. + karakter STAT tarla. Şimdi aşağıdaki komutu kullanarak sürecin ana sürecinin kim olduğunu inceleyin:

ps -jp 1 
​​​​​​​# Çıktı
PID PGID SID TTY TIME CMD
1 1 1? 00:00:01sistem

Artık sürecinizin ana sürecinin, sistem işlem. Bir sonraki adım için yeni bir oturum açılması ve işlemin kontrol terminalinden bağlantısının kesilmesi gerektiği yukarıda belirtilmiştir. Bunun için setid işlevini kullanırsınız. Bu aramayı telefonunuza ekleyin _daemon işlev.

Eklenecek kod parçası aşağıdaki gibidir:

if (setsid() == -1) 
dönüş-1;

Artık durumu daha önce teftiş ettiğinize göre _daemon aradı, şimdi ilkini kaldırabilirsiniz getchar içinde işlev test.c kod.

//test.c
#Dahil etmek <stdio.h>
int_daemon(int, int);
intana()
{
_daemon (0, 0);
getchar();
dönüş0;
}

Uygulamayı tekrar derleyip çalıştırdıktan sonra, incelemelerinizi yaptığınız terminale gidin. İşleminizin yeni durumu aşağıdaki gibidir:

ps -C Ölçek -o "pid ppid pgid sid tty durumemretmek"
​​​​​​​# Çıktı
PID PPID PGID SID TT STAT KOMUTU
25494 1 25494 25494? Ss./Ölçek

bu ? giriş yap TT alanı, işleminizin artık bir terminale bağlı olmadığını gösterir. Dikkat edin PID, PGID, ve SID prosesinizin değerleri aynıdır. Süreciniz artık bir oturum lideridir.

Bir sonraki adımda, ilettiğiniz argümanın değerine göre çalışma dizinini kök dizine değiştirin. Aşağıdaki snippet'i ekleyebilirsiniz _daemon bunun için işlev:

if (!nochdir) {
eğer (chdir("/") == -1)
dönüş-1;
}

Şimdi, iletilen argümana göre, tüm dosya tanımlayıcıları kapatılabilir. içine aşağıdaki kodu ekleyin _daemon işlev:

#define NR_OPEN 1024
if (!noclose) {
için (i = 0; ben < NR_OPEN; ben++)
kapat (i);
açık("/dev/boş", O_RDWR);
dup (0);
dup (0);
}

Tüm dosya tanımlayıcıları kapatıldıktan sonra, arka plan programı tarafından açılan yeni dosyalar sırasıyla 0, 1 ve 2 tanımlayıcılarıyla gösterilecektir. Bu durumda, örneğin, baskı koddaki komutlar ikinci açılan dosyaya yönlendirilecektir. Bunu önlemek için, ilk üç tanımlayıcı, /dev/null cihaz.

Bu durumda, sistemin son hali _daemon fonksiyon aşağıdaki gibi olacaktır:

#Dahil etmek <sys/types.h>
#Dahil etmek <sys/stat.h>
#Dahil etmek <stdio.h>
#Dahil etmek <stdlib.h>
#Dahil etmek <fcntl.h>
#Dahil etmek <hata.h>
#Dahil etmek <unistd.h>
#Dahil etmek <sistem günlüğü.h>
#Dahil etmek <dize.h>
int_daemon(geçersiz){
// PID: İşlem Kimliği
// SID: Oturum Kimliği
pid_t pid, sid;
pid = çatal(); // Üst süreci çatalla
eğer (pid < 0) {
çıkış(EXIT_FAILURE);
}
eğer (pid > 0) {
çıkış(EXIT_SUCCESS);
}
// Oluşturmak a SIDiçinçocuk
sid = setid();
eğer (yan < 0) {
// BAŞARISIZ
çıkış(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
// BAŞARISIZ
çıkış(EXIT_FAILURE);
}
kapat (STDIN_FILENO);
kapat (STDOUT_FILENO);
kapat (STDERR_FILENO);
süre (1) {
// Bazı Görevler
uyku (30);
}
çıkış(EXIT_SUCCESS);
}

İşte çalıştıran bir kod parçacığı örneği sshd olarak uygulama arka plan programı:

...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
int fd;
if (arka plan programı (0, 0) < 0)
ölümcül("arka plan programı () başarısız oldu: %.200s", strerror (errno));
/* Kontrol eden tty'den bağlantıyı kesin. */
fd = açık (_PATH_TTY, O_RDWR | O_NOCTTY);
eğer (fd >= 0) {
(geçersiz) ioctl (fd, TIOCNOTTY, NULL);
kapat (fd);
}
}
...

Daemon'lar Linux Sistem Programlama için Önemlidir

Daemon'lar, belirli olaylara yanıt olarak önceden tanımlanmış bir şekilde çeşitli eylemleri gerçekleştiren programlardır. Linux makinenizde sessizce çalışırlar. Kullanıcının doğrudan kontrolü altında değildirler ve arka planda çalışan her hizmetin bir arka plan programı vardır.

Linux işletim sisteminin çekirdek yapısını öğrenmek ve çeşitli sistem mimarilerinin çalışmasını anlamak için cinlerde ustalaşmak önemlidir.

Daemon Nedir?

Sonrakini Oku

PaylaşmakCıvıldamakPaylaşmakE-posta

İlgili konular

  • Linux
  • Linux çekirdeği
  • Programlama
  • C Programlama

Yazar hakkında

Fatih Küçükkarakurt (5 Makale Yayınlandı)

Matematik ve teknolojinin hayranı olan bir mühendis ve yazılım geliştiricisi. Bilgisayarları, matematiği ve fiziği her zaman sevmiştir. Oyun motoru projelerinin yanı sıra makine öğrenimi, yapay sinir ağları ve lineer cebir kütüphaneleri geliştirmiştir. Ayrıca makine öğrenmesi ve lineer matrisler üzerinde çalışmalarını sürdürmektedir.

Fatih Küçükkarakurt'dan Daha Fazla

Haber bültenimize abone ol

Teknik ipuçları, incelemeler, ücretsiz e-kitaplar ve özel fırsatlar için bültenimize katılın!

Abone olmak için buraya tıklayın