Linux’taki Özel Aygıt Dosyaları
/dev/null dosyasına yazılan her şey tamamen atılmaktadır. Yani bu gerçek bir dosya değildir.
/dev/null dosyasından okuma yapıldığında her zaman EOF okunur.
/dev/zero dosyası içerisinde sonsuz tane 0 bulunan bir dosya gibi işlem görmektedir. Bu
dosyaya yazma yapılamamaktadır.
/dev/full dosyası yazma yapmakta kullanılır. Bu dosyayı ne zaman yazma yapılmaya
çalışılırsa “disk full” okunur. Programların tamamen disk dolduğundaki davranışlarını test
etmek amacıyla kullanılır.
proc Dosya Sistemi
Unix sistemlerinin çekirdek özelliklerine ilişkin taşınabilir sistem fonksiyonları çok azdır.
Örneğin process listesi alınacak olsa bunu yapmanın taşınabilir bir yolu yoktur. ps programı
da bunu tamamen aşağı seviyeli çekirdek özellikleriyle yapmaktadır. Unix sistemlerindeki
proc dosya sistemi /proc dizinine mount edilmiştir. Bu dosya sistemi gerçek bir dosya sistemi
değildir. Bu dosya sistemi içerisindeki çeşitli dosyalar sistemin durumu hakkında bilgiler
içerirler. Yani o dosyaları açıp onların içerisinden okuma yapmakla çekirdeğe ilişkin bilgiler
edinilebilir. Proc dosya sistemi tüm Unix sistemlerinde olan bir sistem değildir. Ancak Unix
sistemleri gittikçe daha fazla bu dosya sistemini desteklemektedir. Proc dosya sisteminin
önemli elemanları şunlardır.
/proc/version: Linux sisteminin versiyon numarasını ve hangi gcc derleyicisiyle derlendiğini
verir.
/proc/cpuinfo: Bu dosya çalışılan işlemci hakkında bilgiler verir.
/proc/filesystems: O anda register ettirilmiş olan dosya sistemlerini gösterir.
/proc/ioports: Kullanılan IO portlarının hangi işlemcilere tahsis edildiğini gösterir.
O anda çalışan tüm process’ler için process numarasına ilişkin dizinler yaratılmıştır. /proc/self
dizini o anda çalışmakta olan process’e link edilmiştir. Process’leri belirten dizinler içerisinde
standart dosyalar vardır. cmdline processin komut satırı argümanlarını belirtir.
/* dev.c */
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define SECT_SIZE 512
typedef unsigned char BYTE;
int main(int argc, char *argv[])
{
int fd, i;
BYTE buf[SECT_SIZE];
if (argc != 3) {
fprintf(stderr, "Wrong number of arguments!..\n");
exit(1);
}
if ((fd = open(argv[1], O_RDWR)) == -1) {
perror("open");
exit(1);
}
if (read(fd, buf, SECT_SIZE) == -1) {
perror("read");
exit(1);
}
i = 0;
do {
putchar(buf[i]);
} while (buf[i++] != '\n');
close(fd);
return 0;
}
/* sector.c */
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define SECT_SIZE 512
typedef unsigned char BYTE;
int main(int argc, char *argv[])
{
int fd, i;
BYTE buf[SECT_SIZE];
if (argc != 3) {
fprintf(stderr, "Wrong number of arguments!..\n");
exit(1);
}
if ((fd = open(argv[1], O_RDONLY)) == -1) {
perror("open");
exit(1);
}
lseek(fd, atoi(argv[2]) * SECT_SIZE, SEEK_SET);
if (read(fd, buf, SECT_SIZE) == -1) {
perror("read");
exit(1);
}
for (i = 0; i < 64; ++i)
printf("%x%c", buf[i], (i % 16 == 15) ? '\n' : ' ');
close(fd);
return 0;
}
Karakter ve Blok Aygıtları
Unix sistemlerinde aygıtlar blok ve karakter aygıtları olmak üzere ikiye ayrılır. Blok aygıtları
rastgele erişime izin veren aygıtlardır. Yani lseek fonksiyonu ile rastgele konumlandırma
yapılabilir. Halbuki karakter aygıtları byte byte okuma yapılabilen aygıtlardır. Tipik olarak
disk sistemleri blok aygıtları, seri port, paralel port gibi aygıtlar da karakter aygıtlarıdır.