#include<stdio.h>
#include<signal.h>

void foo(int a)
{
     printf("Kapanmıyorum!\n");
}

void main()
{
     signal(SIGINT, foo);
     while(1);
}

Program while(1) döngüsünde sonsuz döngüsünde bırakılsada, eğer dışarıdan ctrl+c yardımıyla programı sonlandırmak istediğimizde program "kapanmıyorum!" yazacaktır.

  • signal.h kütüphanesini unutma
  • signal(sinyal tipi, fonksiyon)
  • fonksiyon void döndürmelidir.

Bu durumdaki process CTRL+Z yapılarak kapatılabilir. CTRL+Z yapıldıktan sonra ps ile process pid sini bulup kill -9 pid yazarak atta yolluyoruz.


#include<stdio.h>
#include<signal.h>

void foo2(int a)
{
     printf("Merhaba!\n");
     alarm(1);
}

void main()
{
     signal(SIGALRM, foo2);
     raise(SIGALRM);
     while(1);
}

Program gene while(1) döngüsündeyken her 1 saniyede çalışmasını istediğimiz bir işi bu şekilde tanımlıyoruz.

  • signal.h kütüphanesini unutma
  • fonksiyon void döndürmeli
  • signal(ALARM KODU YANI SIGNALRM, fonksiyon adi)
  • raise(SIGALRM) ile alarm çağrısı yapıyoruz
  • alarm(1) ilede 1 sn sonra alarm yapmasını sağladık. eğer alarm(1) çağrısını belirli bir if içine alsaydık ve koşul sağlamasaydı bir daha Merhaba yazmayacaktı

#include<stdio.h>
#include<unistd.h>

void main()
{
  int pid;

  pid = fork();
  if(pid == 0){ // burası yavru proses
    printf("Merhaba burası yavru proses\n");
  } else if(pid > 0) { // burası ebeveyn
    printf("Merhaba burası ebeveyn\n");
  } else if(pid < 0) { // hata
    printf("Fork hatası\n");
  }

}

Program sayesinde çatallama yapabiliyoruz. Daha önce bahsettiğimiz gibi, fork aktif çalışan prosessin kopyasını oluşturur ve aynı makine kodundan çalışmaya devam eder. Yani diyelimki fork() çağrısı 5. satırda yapılmış. Yeni oluşturulan processte programa baştan başlamıyorsunuz gene 5. satırdasınız. Bu şekilde çatallama yapıyoruz.

  • unistd.h kütüphanesini unutma

Depolama Hiyerarsisi


çoklu fork

#include<stdio.h>
#include<unistd.h>

void main()
{
  int pid, pid2;

  pid = fork();
  if(pid == 0) { // yavru
    pid2 = fork();
  }

Depolama Hiyerarsisi


çoklu fork 2

#include<stdio.h>
#include<unistd.h>

void main()
{
  int pid, pid2;
  pid = fork();
  pid2 = fork();

Depolama Hiyerarsisi


#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<string.h>

void main()
{
  int pid;
  int pdes[2];
  char buf, buf1;

  pipe(pdes);


  pid = fork();
  if(pid == 0){ // burası yavru proses
    printf("Merhaba burası yavru proses\n");
    close(pdes[1]); // yazma ucu kapatılıyor
    while(1){
      buf1 = ' ';
      read(pdes[0], &buf1, 1);
      printf("Tamam okundu = %c\n", buf1);
    }

  } else if(pid > 0) { // burası ebeveyn
    close(pdes[0]); // Okuma ucu kapatılıyor

    int cnt = 0;
    while(1) {
      buf =  (char) 'A' + (++cnt % 27);
      write(pdes[1], &buf, 1);
      printf("Ebeveyn yazdı\n");
    }
    //    printf("Merhaba burası ebeveyn\n");
  } else if(pid < 0) { // hata
    printf("Fork hatası\n");
  }
  close(pdes[0]);
  close(pdes[1]);
}

// Semafor çalışması
#include<stdio.h>
#include<unistd.h>
#include<unistd.h> 
#include<sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <signal.h>
#include<errno.h>


#define SEMKEY  123456

int semGet(key_t key, int initval)
{
    int id;

    if((id = semget(key, 1, 0700|IPC_CREAT)) < 0)
    {
     printf("semGet: semget");
     return(-1);
    }

    if(semctl(id, 0, SETVAL, initval) < 0)
     printf("semGet:semctl");

    return(id);
}

void semSignal(int id, int value)
{
    static struct sembuf semafor;
    semafor.sem_op = value;
    semop(id, &semafor, 1);
}

void semWait(int id, int value)
{
     static struct sembuf semafor;
     semafor.sem_op = -value;
     semop(id, &semafor, 1);
}

void semSil(int id)
{
     semctl(id, 0, IPC_RMID, 0);
}


void main()
{
     int pid;
     int i;
     int sem;

     sem = semGet(SEMKEY, 0);

     pid = fork();

     if(pid == 0) { // yavru proses

             printf("A\n");
      semSignal(sem, 1);
     } else if(pid > 0) { // ebeveyn proses
       //  for(i=0;i<1000000;i++) ;
             semWait(sem, 1);
      printf("B\n");
     }
     // semSil(sem);
}