İşletim sistemleri ve komut satırları (CLI) her zaman ilgimi çekmiştir. "Siyah ekrana bir yazı yazıyoruz ve sistem bunu nasıl anlıyor?" sorusunun peşine düştüm ve C dilinde kendi mini işletim sistemi simülasyonumu, BerkayOS'u geliştirdim.
Bu proje basit bir algoritma çözümü değil; bellek yönetimi, string parçalama (parsing) ve dosya sistemi simülasyonunu içeren bütünleşik bir yapı.
🛠️ Neler Yaptım?
Bu sistemde standart bir terminalde yapabildiğiniz temel işlemleri simüle ettim:
Komut Parçalama (Parsing):
Kullanıcıdosya_olustur deneme.txtyazdığında, sistem bunustrtokfonksiyonu ile parçalara ayırıyor. İlk kelimeyi "komut", diğerlerini "argüman" olarak işliyor.Sanal Disk Yönetimi:
Gerçek harddisk yerine RAM üzerinde çalışan birstructyapısı kurdum. Dosyaları oluşturup, içine veri yazıp silebiliyoruz.Uygulama Entegrasyonu:
Daha önce yazdığım "Öğrenci Not Sistemi"ni bu kabuğun içine bir komut (not_sistemi) olarak gömdüm. Yani işletim sisteminin içinde ayrı bir program çalıştırabiliyoruz.Dinamik Bellek Yönetimi:
Girilen her komut içinmallocile yer açıp, işlem bitincefreeile temizleyerek "Memory Leak" (Bellek Sızıntısı) oluşmasını engelledim.
💻 BerkayOS Kaynak Kodu
İşte komut satırı arayüzünü ve dosya yönetimini sağlayan kodun tamamı:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char isim[20];
char icerik[100];
int dolu_mu;
}dosya;
typedef struct {
char name[20];
int vize ;
int final;
}ogrenci;
dosya disk [5];
typedef struct {
char *komut_adi;
char **argumanlar;
int arguman_sayisi;
} komut;
void komut_temizle (komut *islem) {
if (islem->komut_adi != NULL) {
free(islem->komut_adi);
}
if (islem->argumanlar != NULL) {
for (int i = 0; i < islem->arguman_sayisi; i++) {
if (islem->argumanlar[i] != NULL) {
free(islem->argumanlar[i]);
}
}
free(islem->argumanlar);
}
free(islem);
}
int main(void) {
for (int i = 0; i < 5; i++) {
disk[i].dolu_mu = 0;
}
char satir[1000];
while (1) {
printf("BerkayOS > ");
fgets(satir, sizeof(satir), stdin);
satir[strcspn(satir, "\n")] = '\0';
komut *yeni_islem = malloc(sizeof(komut));
yeni_islem->argumanlar = malloc(10*sizeof(char*));
yeni_islem->arguman_sayisi = 0;
char *ilk_parca = strtok(satir, " ");
if (ilk_parca== NULL) {
free(yeni_islem->argumanlar);
free(yeni_islem);
continue;
}
if (ilk_parca != NULL) {
yeni_islem->komut_adi = strdup(ilk_parca);
}
char *diger_parca = strtok(NULL, " ");
while (diger_parca != NULL) {
yeni_islem->argumanlar [yeni_islem -> arguman_sayisi] = strdup(diger_parca) ;
yeni_islem->arguman_sayisi++;
diger_parca = strtok(NULL, " ");
}
if (strcmp(yeni_islem-> komut_adi, "cikis") == 0 ) {
komut_temizle(yeni_islem);
break;
}
else if (strcmp(yeni_islem-> komut_adi, "yazdir") == 0 ) {
for (int i = 0; i < yeni_islem-> arguman_sayisi; i++) {
printf("%s " , yeni_islem -> argumanlar[i]);
}
printf("\n");
}
else if (strcmp(yeni_islem-> komut_adi, "temizle") == 0 ) {
system("cls");
}
else if (strcmp(yeni_islem-> komut_adi, "dosya_olustur") == 0 ) {
if (yeni_islem-> arguman_sayisi < 1) {
printf("dosya adi giriniz !\n");
}
else {
int basasrili = 0;
for (int i = 0; i < 5; i++) {
if (disk[i].dolu_mu == 0) {
strcpy(disk[i].isim, yeni_islem -> argumanlar[0]);
strcpy(disk[i].icerik, "");
disk[i].dolu_mu =1;
basasrili=1;
printf("basarili dosya olusturldu %s (Index : %d)\n" ,disk[i].isim, i);
break;
}
}
if (basasrili == 0) {
printf("Hata : disk dolu!\n");
}
}
}
else if (strcmp(yeni_islem-> komut_adi, "dir") == 0 ) {
printf("-----Disk Icerigi----- \n");
for (int i = 0; i < 5; i++) {
if (disk[i].dolu_mu == 1) {
printf("Index : %d ismi : %s \n" ,i , disk[i].isim);
}
}
}
else if (strcmp(yeni_islem->komut_adi ,"dosya_yaz") == 0) {
if (yeni_islem-> arguman_sayisi < 2) {
printf("hata :dosya adi ve icerik giriniz \n");
}
else {
int bulundu = 0;
for (int i = 0; i < 5; i++) {
if (disk[i].dolu_mu == 1 ) {
if (strcmp (yeni_islem-> argumanlar[0] ,disk[i].isim ) == 0) {
disk[i].icerik[0] = '\0';
for (int j = 0; j < yeni_islem-> arguman_sayisi; j++) {
strcat(disk[i].icerik , yeni_islem-> argumanlar[j]);
if (j <yeni_islem -> arguman_sayisi - 1)
strcat(disk[i].icerik , " ");
}
bulundu = 1;
break;
}
}
}
if (bulundu == 0) {
printf("boyle bir dosya yok \n");
}
}
}
else if (strcmp(yeni_islem->komut_adi, "dosya_oku") == 0) {
if (yeni_islem-> arguman_sayisi < 1) {
printf("hata :dosya adi giriniz \n");
}
else {
int bulundu = 0;
for (int i = 0; i < 5; i++) {
if (disk[i].dolu_mu == 1) {
if (strcmp(yeni_islem-> argumanlar[0] ,disk[i].isim ) == 0) {
printf("%s " , disk[i].icerik);
bulundu =1;
break;
}
}
}
if (bulundu == 0) {
printf("boyle bir dosya yok \n");
}
}
printf("\n");
}
else if (strcmp(yeni_islem-> komut_adi ,"dosya_sil") == 0 ) {
if (yeni_islem-> arguman_sayisi < 1) {
printf("hata :dosya adi giriniz \n");
}
else {
int bulundu = 0;
for (int i = 0; i < 5; i++) {
if (disk[i].dolu_mu == 1) {
if (strcmp (yeni_islem-> argumanlar[0], disk[i].isim)==0) {
disk[i].dolu_mu =0;
strcpy(disk[i].isim , "");
strcpy(disk[i].icerik , "");
bulundu =1;
printf("Basarili dosya [%s] silinidi \n" , yeni_islem-> argumanlar[0]);
break;
}
}
}
if (bulundu == 0) {
printf("silinecek boyle bir dosya yok \n");
}
}
}
else if (strcmp(yeni_islem-> komut_adi ,"yardim") == 0 ) {
printf("dir ---> komutlari yazdirir\n"
"dosya_olustur ---> dosya olusturmayi sağlar\n"
"dosya_sil---> dosya silmeyi saglar\n"
"dosya_yaz ---> dosya'nın icine yazmayi saglar\n"
"dosya_oku ---> dosyaya yazilanlari okumayi saglar\n"
"yazdir ---> ekrana yazdiginiz islemleri tekrar ekrana yazmaya baslar \n"
"temizle---> ekrani siler \n"
"cikis ---> sistemi kapatmayi saglar \n"
"yardim---> sistem komutlarini gosterir\n"
"not_sistemi ---> not girdi sistemini acar\n"
);
}
else if (strcmp(yeni_islem->komut_adi, "not_sistemi")== 0) {
FILE *belge;
int i;
int kisi;
belge = fopen("notlar.txt" , "a");
if ( belge == NULL ) {
printf("Error opening file");
exit(1);
}
printf("kisi sayisini giriniz");
scanf("%d",&kisi);
ogrenci *dizi = (ogrenci*) malloc(kisi*sizeof(ogrenci));
for (i = 0 ; i<kisi; i++) {
printf("ogrenci adini giriniz ");
scanf("%s" , dizi[i].name);
printf("ogrenci vize giriniz ");
scanf("%d" , &dizi[i].vize);
printf("ogrenci final giriniz ");
scanf("%d" , &dizi[i].final);
}
for (i = 0 ; i<kisi; i++) {
fprintf(belge , "%-10s // %-10d // %-10d \n" , dizi[i].name , dizi[i].vize , dizi[i].final );
}
fclose(belge);
free(dizi);
printf("belge basarıyla olusturuldu\n");
}
else {
printf("bilinmeyen komut [%s]\n" , yeni_islem-> komut_adi);
}
komut_temizle(yeni_islem);
}
return 0;
}
Umarım Beğenirsiniz . Geliştirip paylaşmaya devam edeceğim . :)
Kodlarımı ve gelişim sürecimi GitHub'da paylaşıyorum: GitHub:https://github.com/Berkay-Dmr/C-Learning-Journey.git
Top comments (3)
Merhaba yazıların çok güzel ama galiba ai ile yazıyorsun. Özellikle kodları takip etmek bana zor ve garip geliyor biraz daha derli toplu olursa çok keyifli olur gibi. Kodları komple blog'a yazmak yerine parça parça açıklayarak gidersen daha takip edilebilir olur gibi geldi. Eline sağlık tekradan :)
ilk olarak yorum yaptığın için çok teşekkür ederim. Yazıların : mesela Neler Yaptım kısmı gibi yerleri ai ile yazdığım doğru ama kodun kendisi ve fikri bana ait .Dediğin gibi diğer yazılarımda kodu elimden geldiği kadar parça parça yazmaya çalışacağım . :)
Yazıların devamını bekliyorum :)