[Makale] C’nin Standart Dosya Fonksiyonlarının Uyguladığı Tamponlama Mekanizması
Standart C fonksiyonlarını kullanmadan bir dosyanın her byte’ı üzerinde sırasıyla işlem yapmak isteyelim. Herhalde ilk akla gelecek yöntem doğrudan işletim sisteminin sistem fonksiyonlarını çağırmak olacaktır. Örneğin UNIX/Linux sistemlerinde dosyayı read fonksiyonuyla (Windows sistemlerinde ReadFile fonksiyonuyla) byte byte aşağıdaki gibi okuyabiliriz:
int fd;
ssize_t result;
unsigned char ch;
if ((fd = open("test", O_RDONLY)) < 0) {
perror("open");
exit(EXIT_FAILURE);
}
while ((result = read(fd, &ch, 1)) > 0) {
/* Okunan byte işleniyor */
}
if (result < 0) {
perror("read");
exit(EXIT_FAILURE);
}
close(fd);
[Makale] Programların Komut Satırı Argümanları
İşletim sistemi tarafından prosese geçirilen komut satırı argümanları program içerisinden çeşitli biçimlerde elde edilebilmektedir. En yaygın yöntem komut satırı argümanlarının programın başlangıç fonksiyonunun parametrelerinden elde edilmesidir. Örneğin, C ve C++’ta komut satırı argümanları main fonksiyonuna parametre olarak geçirilirler. Bu dillerin standartlarına göre programın başlangıç noktasını (entry point) belirten main fonksiyonunun parametrik yapısı ve geri dönüş değeri aşağıdaki iki durumdan biri biçiminde olmalıdır:
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }
[Makale] UNIX/Linux ve Windows Sistemlerinde Stdin, Stdout ve Stderr Dosyaları
Yalnızca UNIX/Linux sistemlerinde değil modern işletim sistemlerinin çoğunda aygıtlar birer dosyaymış gibi ele alınmaktadır. Örneğin klavye ve ekran -aslında birer dosya olmadığı halde- işletim sistemi tarafından sanki birer dosyaymış gibi işleme sokulurlar. Aygıtlara ilişkin bu tür dosyalar için de birer dosya betimleyicisi ve dosya nesnesi vardır. Bu betimleyicilerle işlem yapıldığında işletim sisteminin dosya alt sistemi aslında bu dosyaların birer aygıta ilişkin olduğunu anlar ve okuma/yazma amacıyla o aygıtlara yönelir. UNIX türevi sistemlerdeki çokbiçimliliği (polymophism) andıran bu tasarıma Sanal Dosya Sistemi (Virtual File System) denilmektedir.
[Blog] C#'taki Yapı ve Sınıf Nesneleri Nerede Yaratılıyor?
Pek çok C# programcısının sınıf ve yapı kavramlarıyla stack ve heap kavramlarını yanlış bir biçimde ilişkilendirdiğini görüyorum. Örneğin, “yapı nesneleri stack’te sınıf nesneleri heap’te tutulur” biçiminde yanlış anlaşılmaya yol açacak bilgiler veren yerli ve yabancı çok sayıda yazı ve makaleyle karşılaştım. Konuya biraz açıklık getirmek istiyorum.
[Makale] UNIX/Linux Sistemlerinde Dosya Betimleyicilerinin Anlamı
UNIX/Linux sistemlerinde her prosesin proses tablosu yoluyla erişilen bir dosya betimleyici tablosu (file descriptor table) vardır. Dosya betimleyici tablosu bir gösterici dizisi biçimindedir. Betimleyci tablo içersindeki her gösterici açılmış bir dosyanın bilgilerinin tutulduğu ve ismine dosya nesnesi (file object) denilen bir veri yapısını gösterir. open fonksiyonundan elde edilen dosya betimleyicisi (file descriptor) prosesin dosya betimleyici tablosunda bir indeks belirtmektedir.
[Makale] Proseslerin Çevre Değişkenleri
Modern işletim sistemlerinde her prosesin bir çevre değişken bloğu vardır. Prosesin çevre değişken bloğu çevre değişkenlerinden ve onların değerlerinden oluşmaktadır. Örneğin, MESAJ bir çevre değişkeninin ismi olabilir, “Merhaba Dunya” ise onun değeri olabilir. Çevre değişkenleri pek çok işletim sisteminde proses yaratılırken belirlenebilmekte ya da üst prosesten (parent process) aktarılabilmektedir. Çevre değişkenlerinin üst prosesten aktarılması en çok karşılaşılan tipik durumdur.
Ben on yılı aşkın bir süredir GPS kullanıyorum. Eskiden SA (Selective Availability) denilen hassaslık bozma sistemi yürürlükteydi. O zamanlar hata miktarı da göreli olarak yüksekti (100 metre civarında). 1 Mayıs 2000’de Clinton’ın onaylamasıyla bu bozucu etki ortadan kaldırıldı. Bugün iyi bir ortamda ve konumda 5 metre civarında bir duyarlılık elde edilebiliyor. Yani bir GPS konumunuzu 5 metre civarında dairesel bir alan içerisinde belirleyebiliyor.
Aşağıdaki kod parçası C/C++’da geçerli olduğu halde C# ve Java’da geçersizdir:
{
int a;
//...
{
long a; // C/C++’da geçerli Java ve C#’ta geçersiz!
//...
}
}
Üniversitelerdeki bazı bölümlerde biçimsel diller ve otomatlar (formal languages and automata) gibi dersler veriliyor olsa da bu derslerden pek bir fayda sağlanamadığını görüyorum. Öyle ki, dersi alan öğrenci bunun uygulamada nelere karşılık geldiğinin çıkarımını yapamıyor. Geçen gün, “C’yi biçimsel bir dil olarak nasıl tanımlarsınız?" diye sordu bir öğrencim. "Alfabesi nedir? Derslerde gördüklerimizin C gibi bir dil için anlamı nedir?”
İnceledeğim bazı kodlarda programcıların hangi fonksiyonların başarılarını kontrol edecekleri yönünde tereddütler yaşadığını görüyorum. Bu konudaki tereddütleri gidereyim dedim. Şimdi bakın, aşağıdaki kodda sizce bir tuhaflık var mı?
FILE *f;
...
f = fopen("test.dat", "r");
...
if (fclose(f)) {
fprintf(stderr, "Cannot close file!..");
exit(EXIT_FAILURE);
}
Dün bir öğrencim “bir .EXE ya da .DLL dosyasının .NET dosyası mı yoksa doğal kod içeren bir dosya mı olduğunu nasıl anlarım?” diye sordu. Son zamanlarda bu tür sorular çok sorulduğu için “genel bir açıklama yapayım” dedim. Öncelikle şunu belirteyim: .NET sisteminde kullanılan .EXE, ve .DLL dosyalarına assembly dosyaları deniyor. Buradaki assembly terimini sembolik makina dili (assembly language) derken kullanılan assembly ile karıştırmayın.
Microsoft ve Borland derleyicilerindeki __stdcall, __asm, __int64 gibi eklenti niteliğindeki anahtar sözcüklerin neden iki alt tire ile başlatıldığı bana çok soruldu. “Hadi alt tire ile başlatacaklardı da neden bir tane değil de iki tane?” diye merak ediyorlardı. Peki _access gibi, _mkdir gibi standart olmayan fonksiyonları neden Microsoft tek alt tire ile başlayarak isimlendirmiş, siz de merak ettiniz mi?..
Geçen gün derste yine do-while döngüsündeki noktalı virgül hakkında açıklama yapmak zorunda kaldım. Önce okuyucular için şunu hatırlatmak isterim: do-while döngüsünün sonundaki noktalı virgül boş deyim değil, sözdizimi (sentaks) için gerekli bir atomdur. Peki:
do {
...
} while (ifade);
buradaki noktalı virgüle gerek var mı? Eğer olmasaydı gramerde iki anlamlılık (ambiguity) oluşur muydu? Benim yanıtım hayır.
Son uçak kazasından sonra yine benzer şeyler yazıldı, çizildi, söylendi. Medyacılar her yerde bilir kişi aradılar, yakalarından tuttuklarını televizyonlara, radyolara çıkardılar. Dayadılar mikrofonu: “Söyle neden düştü bu uçak? Yakıtı mı bitti, vorteks mi oldu, pilotaj hatası mı yoksa, kule kuleliğini yapabildi mi?..” Pek çok konuşmadan şöyle sonuçlar çıkarıldığına tanık oldum: “THY dünyanın en iyi havayolu şirketlerinden biridir. Hata kimsede değildir. Bu da bir şanssızlıktır.” Ah bir tek kişi de şu istatistikleri yetkililerin, ilgililerin, bilgililerin yüzüne vuramadı. O zaman iş başa düştü demek ki. Herkes sussun da rakamlar konuşsun:
CSD C ve Sistem Programcıları Derneği