İsimli ve İsimsiz pipe’lar Arasındaki Fark
İsimsiz pipe’larda pipe’tan okuma ve yazma yapmak için kullanılan betimleyiciler başka bir
processe ancak fork ve/veya exec yoluyla aktarılırlar. Oysa isimli pipe’larda bir isim üzerinde
anlaşıldığı için haberleşme işlemi tamamen farklı process’ler arasında pipe yoluyla
yapılabilmektedir.
Sınıf çalışması: İsimli bir pipe’ı shell üzerinden yaratınız. İki program yazınız. Birinci
program 1’den 1000’e kadar sayıları bir döngü içerisinde pipe’a yazsın. İkinci program aynı
pipe’tan okuma yaparak bu sayıları elde etsin. Birinci program pipe’ı O_WRONLY, ikinci
program ise O_RDONLY modunda açacaktır.
Açıklamalar: Yazma ve okuma işlemleri işlemi aşağıdaki gibi yapılabilir.
for (int i = 0; i < 1000; ++i)
write(fd, &i, sizeof(int));
while (read(fd, &i, sizeof(int)) > 0)
printf(“%d\n”, i);
/* first.c */
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
int main()
{
pid_t pid;
int i;
pid = open("npipe", O_WRONLY);
for (i = 0; i < 1000; ++i)
write(pid, &i, sizeof(int));
return 0;
}
/* second.c */
C ve Sistem Programcıları Derneği 108
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
int main()
{
pid_t pid;
int i;
pid = open("npipe", O_RDONLY);
while (read(pid, &i, sizeof(int)) > 0)
printf("%d\n", i);
return 0;
}
Pipe open fonksiyonuyla açılırken işlemle ilgili en az bir process olup olmadığına bakılır.
Örneğin pipe read modunda açılacak olsun. Eğer pipe’ı write modunda açmış bir process
yoksa bloke open fonksiyonu içerisinde gerçekleşir ve bir process pipe’ı write modunda açtğı
zaman read modunda açmaya çalışan processin de blokesi çözülür. Benzer biçimde pipe’ı
write modunda açmaya çalışan bir process olsun, ama aynı pipe’ı read modunda açmış olan
hiçbir process olmasın. Bu durumda write modunda açmaya çalışan process read modunda
pipe açılmaya çalışıldığı sürece bloke olacaktır.