C Dilinde Dosya Yönlendirmeleri (IO Redirection)

Yayınlayan
Mehmet Kelepçe
Yayınlanma tarihi
23/6/2022
Okuma süresi
5
Dakika
go back icon
Geri Dön

C Dilinde Dosya Yönlendirmeleri (IO Redirection)

Bu yazıda C dilinde “stdin” ve “stdout” işaretlerini (> ve <) kullanmadan dosya yönlendirmelerinin nasıl yapılabildiğinden bahsedilecektir.

Bir program Unix, Linux veya Windows sistemlerinde çalışırken program çıktıları “stdout” ile bir dosyaya yönlendirilebilmekte ve bu şekilde ilgili program çıktıları bir dosyaya yazılabilmektedir.

Linux sistemlerde “stdout” yönlendirmesi aşağıdaki şekilde yapılmaktadır.

# ./program > cikti.txt

Bu kullanım ile çalıştırılan “program” isimli programa ait çıktı bilgisi “cikti.txt” dosyasına yazdırılacaktır.

Yukarıda bahsedilen yönteme benzer şekilde “stdin” ise programa girdi sağlamak için kullanılabilmektedir. “stdin” işlemi için küçüktür işareti (< ) kullanılmaktadır. Bununla birlikte aşağıdaki yönlendirme şekili de ayrıca karşımıza çıkabilmektedir.

# find / -name *.txt 2>/dev/null

Bu tarz yönlendirmelerde başına “2” getirilen büyüktür işareti (>) “stderr”i temsil etmektedir. Yukarıdaki kullanım baz alınacak olursa “stderr” ile “find” komutunun çalıştırılması esnasında oluşabilecek herhangi bir hata gösterilmeyecek ve /dev/null’ın içerisine yazılacaktır. “/dev/null” diye bir dosyanın bulunmaması sebebiyle bu tür bir kullanımda “stderr” çıktıları hiçbir dosyaya yazdırılmamaktadır. Burada /dev/null dosyasının altının delik olduğu ve her şeyin aşağı düştüğü, hiç bir şeyin barındırılmadığı bir sepet olarak tahayyül edilebilir.

Bahsedilen program çıktısı yönlendirme işlemi C dilindeki standart fonksiyonlar kullanılarak da yapılabilmektedir. Bu işlem için “freopen” fonksiyonu kullanılmaktadır. Fonksiyona ait prototipe bakıldığında kullanımının aşağıdaki gibi olduğu görülmektedir: (bkz. https://linux.die.net/man/3/freopen)

FILE *freopen(const char *path, const char *mode, FILE *stream);

Fonksiyona verilen birinci parametre üzerine yazılacak dosyanın yolunu, ikinci parametre hangi mod ile işlem yapılacağını, üçüncü parametre ise hangi dosyanın yönlendirileceğini ifade etmektedir.

Üçüncü parametreye “stdin”, “stdout” veya “stderr” işlemleri yazılarak ilgili dosyaya yönlendirme yapılabilecektir.

“stdout” üzerine yapılabilecek yönlendirmelere örnek olması açısından aşağıdaki kodu yorumlayabiliriz.

#include

#include

int main() {

     FILE *f;

     int i;

     if ((f = freopen("test.txt", "w+", stdout)) == NULL) {

           fprintf(stderr, "acilamadi\n");

           exit(EXIT_FAILURE);

     }

     for (i = 0;i < 10; ++i) {

           printf("%d\n", i);

     }

     fclose(f);

     return 0;

}

“freopen” fonksiyonuna geçmeden önce hemen altındaki for döngüsüne bakılacak olursa; döngü 0 dan 9’a kadar olan sayıları ekrana yani “standart output”a (stdout) yazdırmaktadır. Yukarıdaki kodda “freopen” fonksiyonunu kullanarak “standart output”a yazdırılacak bu çıktı test.txt dosyasına yönlendirilmektedir. “freopen” fonksiyonunun üçüncü parametresine verilen “stdout” ile bu imkân sağlanmış olur. Kodun derlenip çalıştırılması durumunda proje dizini altında test.txt dosyası oluşacak ve dosya içeriği aşağıdaki görseldeki gibi olacaktır.

Freopen fonksiyonuna ait parametre bilgilerinde hangi mod ile işlem yapılacağını belirtmek için “w, w+, r.. “gibi mod bilgileri girilmektedir. Bu modlara yönelik bilgilere aşağıdaki tablodan ulaşabilirsiniz.

Sıra

Mod & Açıklama

1

“r”

Okumak için bir dosyayı açar, bunu yapabilmesi için bir dosyanın daha önceden oluşturulmuş olması gerekir.

2

”w”

Yazmak için boş bir dosya oluşturur. Eğer aynı isime sahip herhangi bir dosya varsa içeriğini siler ve dosya boş olarak kabul edilir.

3

”a”

Bir veriyi dosyanın sonuna ekler ve eğer dosya yoksa oluşturur.

4

”r+”

Hem okumak hem de güncellemek için bir dosya açar. Bunu yapabilmesi için daha önceden dosyanın oluşturulmuş olması gerekir.

5

”w+”

Hem okuma hem de yazma için boş dosya oluşturur.

6

”a+”

Okuma ve ekleme için bir dosya açar.

Mehmet KELEPÇE

Senior Cyber Security Specialist | Red Team

Mehmet Kelepçe

Detaylı Bilgi İçin

info@gaissecurity.com