#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 sonraps
ile process pid sini bulupkill -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
çoklu fork
#include<stdio.h>
#include<unistd.h>
void main()
{
int pid, pid2;
pid = fork();
if(pid == 0) { // yavru
pid2 = fork();
}
çoklu fork 2
#include<stdio.h>
#include<unistd.h>
void main()
{
int pid, pid2;
pid = fork();
pid2 = fork();
#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);
}