Geri Dön   Forum Ti > Yardım ve Destek > Korunma - Güvenlik > Hacking - Saldırı > Web Sitesi Çökertme
Üye Ol Üye Listesi Takvim Forumları Okundu İşaretle

Web Sitesi Çökertme Web sitesi çökertmekle ilgili her konuda bilgi bulabilirsiniz yada bildiklerinizi diğer üyelerle paylaşabilirsiniz.
HER TÜRLÜ HACK VE HACK İSTEĞİ YASAKTIR!

Cevap
 
Konu Araçları
Eski 10.09.2005   #1 (permalink)
PiLoT
Ziyaretçi
 
Mesajlar: n/a
Varsayılan PIPE Nedir?

PIPE Nedir?

Linux ve diğer tüm UNIX türevi işletim sistemlerinin çok hoş bir özelliği de küçük komut zincirlerini bir araya getirerek büyük programlardan daha kabiliyetli küçük programlar yazmaktır. Bahsettiğim, süreçler arası haberleşme tekniği mekanizması olan pipe’tır. Pipe ilk olarak UNIX’in gelistirildigi Bell labaratuarlarinda gelistirilmistir. Pipe işlemlerini "|" simgesi ile gösteririz. Hemen hemen bütün kabuklar bunu destekler. Borulama kısaca bir programın standart çıkışını başka bir programa standart giriş olarak verme diye tanımlanabilir. Örneğin:

cclub:~> ls -l | grep cpp

Yukarıdaki komut dizinde, içerisinde cpp geçen dosyaların ismi ekrana basar. Şöyleki: "ls -l" dizindeki dosyaları çıktı olarak üretir. Bu çıktılar girdi olarak grep komutuna verilir. grep ise girdide arama yapan bir komuttur. Dolaysıyla dizindeki dosyalardan ismi cpp içerenlerin adını yazar. Burada dikkat ederseniz "ls -l" komutunun çıktısı ekrana basılmadı. Aynı şekilde grep’e üçüncü parametre olarak verilmesi gereken dosya isimleri verilmedi.

FIFO, pipe ile transfer edilecek veriler için bir yoldur. İlk giren, ilk çıkar mantığı ile çalışır. Gerçek bir boru düşünün. Boruya kırmızı bir top, sonra mavi bir top, sonra yeşil bir top sokalım. Borunun diğer tarafından sırasıyla kırmızı, mavi ve yeşil top çıkar. Bu bir veri yapısıdır. Bundan başka ters çalışan yığın denilen LIFO vardır. Burada son giren ilk çıkar. Bunu da şu şekilde hayal edin: Bir çuvala üst üste sırasıyla kırmızı, yeşil, mavi paketler koyalım ve kargoya verelim. Kargoyu teslim alan paketleri mavi, yeşil, kırmızı sırasıyla çıkarır.

Pipe ile çalışan programlar yazabilmek için bilmemiz gereken bazı şeyler var. Bunlardan ilki pipe fonksiyonudur. Tahmin edebileceğiniz fonksiyon aynı isme sahiptir ve unistd.h içerisinde prototipi şu şekilde tanımlanmıştır:

int pipe( int filedes[2] ) ;

Bu fonksiyon iki adet dosya tanımlayıcısı oluşturur: okumak için filedes[0] ve yazmak için filedes[1]. Fonksiyon sorunsuz çalıştığında 0 değerini geri döndürür.
<DIV align=left>
<DIV align=center>

// pipe.c - Pipe ile süreç haberleştirme
// Versiyon: 011231
// Baris Simsek, <bsimsek@bimel.com.tr>
// http://www.acikkod.org

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
pid_t pid;
int mypipe[2];
char buffer[100];

/* Pipe oluştur. */
if (pipe(mypipe))
{
fprintf(stderr, "Pipe oluştururken hata oluştu. ");
return 1;
}

/* Çocuk süreç oluştur. */
pid = fork();
if(pid == (pid_t) 0)
{
/* Çocuk süreç. */
read(mypipe[0], buffer, 100);
printf("%s ", buffer);
return 1;
}
else if (pid < (pid_t) 0)
{
fprintf(stderr, "Fork yaparken hata oluştu. ");
return 1;
}
else
{
/* Ana süreç. */
write(mypipe[1], "hello world!", 13);
return 1;
}

return 0;
}

Yukarıdaki örnekte fork() ile ikinci bir süreç oluşturduk. Ve sonra bu süreç ile pipe’ın okunan kısmından (mypipe[0]) 100 byte’lık buffer okuduk. Ana süreç içerisinden de pipe’ın yazılacak kısmına (mypipe[1]) "hello world!" mesajını yazdık.

Fork yaptığınız zaman çocuk süreç ana sürecin bütün durumuna aynen sahip olur. Açık dosya tanımlayıcılarını da kopyalar. Bu nedenle pipe oluşturduktan sonra fork ederseniz, oluşturduğunuz pipe’ı iki process’in haberleşmesi için kullanabilirsiniz. Yukarıdaki kod buna bir örnektir. Ekrana yazılan "hello world!" mesajı, ana sürecin çıktısı olsa da ekrana basan çocuk süreçtir. Ana sürec bu mesajı pipe’a yazmış, çocuk süreç te pipe’dan okumuştur.

Eğer pipe’a yazılandan çok veri okumaya çalışırsanız, ancak yazılan kadar veri alabilirsiniz. Eğer pipe’dan son okumanızdan sonra pipe’a hiçbir şey yazılmamış ise ve siz pipe’dan okumaya çalışıyorsanız programınız bloke edilecektir. Ta ki yeni veri yazılana kadar veya pipe’ın yazılan ucu kapatılana kadar. Bunu göz önünde tutarak programlarınızı istenmeyen sonuclardan koruyunuz. UNIX işletim sistemlerinde dışardan veri bekleyen süreçlerin "zamanlayıcı" (scheduler) tarafından bloke edildiğini hatırlayın.

Linux pipe’ları yazılırken 4096 byte sınırına sahiptir. 4k’dan daha büyük veri pipe’a yazacağı zaman süreç bloke olur ve pipe’dan okuma yapılmasını bekler.

FIFO Dosyalar

Eğer iki süreç bir pipe üzerinden haberleşmek istiyor ve aynı süreç altında calışmıyorsa pipe() fonksiyonu işlerini görmeyecektir. Ancak üzülmeyin, bu durumda FIFO dosyaları (named pipe) kullanabilirsiniz.

FIFO dosyası, dosya sisteminizdeki sıradan bir dosya gibidir, ancak tıpkı pipe gibi özellikleri vardır. İki süreçten birisi FIFO dosyasını okumak, diğeri yazmak için açabilir. Bu iki süreç FIFO aracılığı ile haberleşebilir. Birinin yazdığını diğeri okur. Yukarıdaki gibi blok olma olayı burada da söz konusu. Sözleri bir yana bırakıp gösteri yapmaya ne dersiniz?

cclub:~> mkfifo myfifo
cclub:~> ls -l myfifo
prw-r--r-- 1 root root 0 Dec 23 20:04 myfifo|

Yukarda yaptıklarıma bir göz atalım: "mkfifo" komutu ile myfifo adında özel dosyamızı oluşturdum. "ls -l" komutu ile dosyamıza baktığınızda, dosya isminin sonuna "|" karakterinin eklendiğini göreceksiniz. Bu karakter ile dosya sistemimiz onun bir FIFO dosyası olduğunu işaretliyor. Biraz man sayfası okuyalım:

DESCRIPTION
mkfifo creates FIFOs (also called "named pipes") with the
specified filenames.

A "FIFO" is a special file type that permits independent
processes to communicate. One process opens the FIFO file
for writing, and another for reading, after which data can
flow as with the usual anonymous pipe in shells or else-
where.

By default, the mode of created FIFOs is 0666 (`a+rw’)
minus the bits set in the umask.

Şimdi gösteriye devam edelim.

cclub:~> cat myfifo

Bu komut sonucunda kabuk program (shell) bekleyecektir. Çünkü sürecimiz bloklanmıştır. myfifo’ya henüz bir seş yazılmadığı halde biz ondan okumak istiyoruz. Şimdi başka bir terminal açın.

cclub:~> cat > myfifo

Bu komutun anlamı klavyeden alınacak girdileri "myfifo" dosyasına yaz. ">" sembolu standart çıktıyı yönlendirmek için kullanılır. "cat" fonksiyonu normalde parametre olarak verilen dosyayı görüntüler. Eğer parametre vermezseniz girdi olarak standart girişi (burada klavye) kullanır. Şimdi en son açtığımız terminalde bir şeyler yazalım. Örneğin "hello world!" yazın. Diğer terminale geçtiğinizde ne göreceksiniz, izleyelim:

2. terminal

cclub:~> cat > myfifo
hello world!

1. terminal

cclub:~> cat myfifo
hello world!

Harika değil mi! İkinci açtığımız terminalde klavyeden girdiklerimizi FIFO dosyamıza yazdık. İlk açtığımız terminalde bloke olmuş sürecimiz pipe üzerine veri yazıldığını gördü ve okuyup "cat" komutu ile ekrana bastı. Gördüğünüz gibi iki süreç arasında haberleşmeyi sağladık.

Bu gösteriyi kabuk programı (shell) kullanarak yaptık. "cat" komutu sayesinde dosyadan okumayı ve yine "cat" komutu ile kabuk programın bir özelliği olan yönlendirmeyi (>) kullanarak ta yazmayı sağladık. FIFO dosyalarını kendi yazacağınız programlarda da kullanabilirsiniz. C içinde FIFO dosyası oluşturmak için mkfifo() fonksiyonunu kullanabilirsiniz. Yine man sayfalarımıza göz atalım:

NAME
mkfifo - make a FIFO special file (a named pipe)

SYNOPSIS
#include <sys/types.h>
#include <sys/stat.h>

int mkfifo ( const char *pathname, mode_t mode );

Prototipi yukarda gördüğünüz gibi. Kullanabilmek için sys/types.h ve sys/stat.h başlık dosyalarını yüklemeniz gerekir. Yazacağınız iki süreçten birisi FIFO dosyasından okumaya, diğeri de FIFO dosyasına yazmaya calışsın. Yukarıdaki iki örneği bu şekilde simule edebilirsiniz.
<DIV align=center>
// fifo-reader.c - FIFO’dan okuyan program
// Versiyon: 011231
// Baris Simsek, <bsimsek@bimel.com.tr>
// http://www.acikkod.org

#include <sys/types.h>
#include <sys/stat.h>

int main()
{
int fd;
char buffer[100];

fd=fopen("myfifo","r");

fgets(buffer,100,fd);
printf("Buffer: %s ",buffer);

return 0;
}
  Alıntı yaparak cevapla
Cevap


Şu Anda Konuyu İnceleyen Aktif Kullanıcılar: 1 (0 üye ve 1 misafir)
 
Konu Araçları


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
ASP Nedir? maChaRa Web Tasarım 0 10.05.2007 05:09
Trojan Nedir? Solucan Nedir? VeNoM Korunma - Güvenlik 1 02.05.2007 22:31
Hacker nedir ? Lamer Nedir ? 4trymebaby Hacking - Saldırı 13 29.04.2007 13:20
Din Nedir? and&and İslamiyet 6 13.06.2006 05:17
Sınıf (Class) Nedir? Nesne (Object) Nedir? MaStEr Web Tasarım 0 04.06.2006 20:20


Şu anki forum saati: 22:25.


cnt hizmet sağlayan firma
ForumTi.com'un yapımı ve yayınlanması CNT'ye aittir.
Sitedeki içerikleri foruma ücretsiz şekilde üye olabilen ziyaretçiler oluşturur. Bu içeriklerin sorumluluğu yazana aittir.
Eğer yasak ve aykırı içerik tespit edilirse site yöneticilerine bu konular bildirilir ve kaldırılır. Site yönetimi haberdar edildiğinde sonuç alınamaz ise servis sağlayıcı CNT'ye bildiride bulunabilirsiniz.
vBulletin® v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Search Engine Friendly URLs by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265