27 Aralık 2014 Cumartesi

C Macro'ları

C MACRO Notları

Macro'nun Tanımlı Olmasını Zorlamak
Örnek:
#if !defined MYMACRO
    #error "MYMACRO is not defined"
#endif

Sayı Sabitleri için Macrolar
Parantez içinde yazılması daha sağlıklı
#define INTMAX_MIN (-9223372036854775807LL)
#define INTMAX_MAX (9223372036854775807LL)

Fonksiyon Gibi Macrolar - Function Like Macros
C ile reflection yapmak mümkün değil ancak MACRO kullanarak bazı metodların işleyişini değiştirebilmek mümkün. Bu tür macrolara "function like macros" deniliyor. Örneğin bir fonksiyonu tanımsız hale getirebiliriz. Özellikle log'lama yeteneğini debug/release derlemeye göre değiştirebilmek için çok kullanışlı bir örnek aşağıda.
#ifdef LOG_ENABLED
 extern "C" void LOG_DEBUG (const char* data);
#else
 #define LOG_DEBUG(data); //Parantez ve macro arasında boşluk olmamalı
#endif

Bir başka yöntem ise boşa tanımlama. Örneğin assert macrosu Visual C++'ta aşağıdaki gibi tanımlı, dolayısıyla sadece debug derlemede çalışır.

#ifdef NDEBUG
    #define assert (_expression) ((void)0)
#endif

Macrolarda Yan Etkilere Dikkat Etmek
Macroları çağırırken, yan etkilere dikkat etmek gerekir. Örnekte aynı işi yapan iki farklı macro tanımlanmış.

Eğer bu macro max(i++,--j) şeklinde çağırılırsa, ilk macroda her a ve b tanımlaması için, istenenden daha fazla işleme sebep olur.

Macroların Parse Edilmesi
Macrolar preprocessor tarafından parse edilirler. Eğer macroya geçilen parametrede virgül karakteri varsa, birden fazla parametre geçiliyormuş gibi algılanabilir. Örnek'te template kullanıldığı için virgül hataya sebep oluyor.
TRAP_EXCEPTION
(
    (std::map<MyType, bool> Map;)
)
Bu gibi durumlarda macro içinde __VA_ARGS__ kullanılabilir.
#define TRAP_EXCEPTION(...) \
    try \
    { \
        try{ __VA_ARGS__ } \
        catch(Engine::Exception& e) \
        { \
            throw MyException(e.message()); \
        } \
    }

Stringification - String Haline Getirmek
Bu tür macrolarda ise macro'ya verilen parametre # işareti ile string haline getiriliyor. Bu yöntemin reflection'da nasıl kullanıldığını açıklamam lazım. Örnek:
Stringification ve Birleştirme
Parametreler #ile string haline getirilir, daha sonra birleştirme için kullanılan karakter string şeklinde araya yazılır. 
#define space_conc(str1,str2) #str1 " " #str2
space_conc(hello, world)) şeklinde çağırıldığında macro 
"hello" " " "world"
şeklinde açılır. Derleyici stringleri birleştirerek 
"hello world"
haline getirir.
Concatinaion - String haline getirmeden, sadece sembol olarak birleştirme
Bu tür macrolarda ise macro açıldıktan sonra ## işaretinin her iki yanındaki karakterler birleştirilir. Bu yöntemin reflection'da nasıl kullanıldığını açıklamam lazım. Örnek:
struct command
{
  char *name;
  void (*function) (void);
};

struct command commands[] =
{
  { "quit", quit_command },
  { "help", help_command },
  ...
};

#define COMMAND(NAME)  { #NAME, NAME ## _command }

struct command commands[] =
{
  COMMAND (quit),
  COMMAND (help),
  ...
};

25 Aralık 2014 Perşembe

Epoch ve API

EPOCH
Bilgisayar sistemlerinde sistem saati için bir başlangıç zamanı belirlenir. Sistem saati bu başlangıç zamanından itibaren geçen süre olarak tutulur. Bu başlangıç yani referans zamana epoch denilir. Epoch kelime anlamı olarak tarih başlangıcı anlamına gelir.

POSIX uyumlu sistemlerde Epoch 1 Ocak 1970 (UTC) gece yarısından (00:00:00) başlar. Açıklaması şöyle.
Unix time (also known as Epoch time, POSIX time, seconds since the Epoch, or UNIX Epoch time) is a system for describing a point in time. It is the number of seconds that have elapsed since the Unix epoch, that is the time 00:00:00 UTC on 1 January 1970, minus leap seconds.
Windows'ta ise Epoch 1 Ocak 1601 tarihinden başlar. Bu tarih tuhaf gibi görünebilir ancak sebebi şöyle açıklanıyor.
"The Gregorian calendar operates on a 400-year cycle, and 1601 is the first year of the cycle that was active at the time Windows NT was being designed. In other words, it was chosen to make the math come out nicely."
Tüm işletim sistemleri Epoch'tan itibaren geçen süreyi alabilmemizi sağlayan bazı API'ler sunarlar. Her API belli bir süre birimi kullanır. Kimisi sadece saniye, kimisi saniye + milisaniye, kimisi saniye + mikrosaniye, kimisi de saniye + nanosaniye birimlerini kullanır. Her ne kullanılırsa kullanılsın tüm API'lerin amacı sistem saatini almaktır.

İşletim sistemi epochtan beri geçen süreyi belli bir çözünürlükte artırır. Bu artırıma resolution denir. Resolution süresi geçmeden arka arkaya aynı API'yi çağırırsak aynı değer alabiliriz.

Esasen sistem saati kronometre olarak kullanılmamalıdır. Sebebi ise bir çok işletim sisteminin NTP ile sistem saatini sürekli ileri geri küçük küçük oynatmasıdır. Dolayısıyla aşağıdaki sürüyle API'nin hiçbirisi sistem saatini göstermek dışında bence fazla bir işe yaramıyor :)

POSIX

ftime - obsolete
Posix Epoch'tan beri geçen süreyi saniye + milisaniye çözünürlüğünde alabilmemizi sağlar. Ancak bu metod obsolete edilmiştir ve saniye seviyesinde çözünürlük için time, mikrosaniye seviyesinde çözünürlük için gettimeofday veya nanosaniye seviyesinde çözünürlük için clock_gettime metodlarından birisinin kullanıması tavsiye edilmektedir.

gettimeofday - obsolete
gettimeofday yazısına taşıdım.

clock_gettime 
clock_gettime yazısına taşıdım

clock_gettime ve clock_getres ilişkisi
Yazının başında da belirttiğim gibi Epoch'tan beri geçen süre belli bir çözünürlükte artırılır. Bu çözünürlüğü öğrenmek için clock_getres kullanılır. Örnek:

void pr(int clock,const char *n)
{
  struct timespec tv = {1,2};
  struct timespec res = {3,4};
  int rc;


  rc=clock_getres(clock,&res);
  if (rc) {
    printf("getres return code on %s=%d errno=%d\n",n,rc,errno);
  }
  rc=clock_gettime(clock,&tv);
  if (rc) {
   printf("gettime return code on %s=%d errno=%d\n",n,rc, errno);
  }
  else {
    printf("%25s=% 11d.%09d resolution=% 2d.%09d\n",n,tv.tv_sec,tv.tv_nsec,res.tv_sec,res.tv_nsec);
  }
}


Bu metod aşağıdaki gibi çağırılırsa
pr(CLOCK_REALTIME,"CLOCK_REALTIME");

şu sonucu alırız.


CLOCK_REALTIME= 1097084999.490116229 resolution= 0.000000040
Yani Epoch'tan beri geçen süre saniye + nanosaniye , resolution ise 40 nanosaniyedir.


WINDOWS
 
GetSystemTime
GetSystemTime yazısına taşıdım.

GetSystemTimeAsFileTime
GetSystemTimeAsFileTime yazısına taşıdım.

NtQuerySystemTime
NtQuerySystemTime yazısına taşıdım.

_ftime
_ftime ile 1 Ocak 1970 (UTC) gece yarısından (00:00:00) itibaren geçen süreyi saniye + milisaniye çözünürlüğünde almamızı sağlar. Posix ile gelen ftime metodunun eşleniğidir.

QueryPerformanceCounter
Bu metodu sonra yazacağım.
 
C Dili
C dilinde time() metodu kullanılır. Epoch'tan beri geçen süreyi saniye çözünürlüğünde almamızı sağlar. Konu uzun olduğu için C'de Time API'leri başlıklı yazıya taşıdım.

C++ Dili
Boost
get_system_time
Bu metod boost derlenirken microsec_clock tanımlı ise onu kullanır, değilse second_clock'ı kullanır. thread_time.hpp dosyasında kod görülebilir.

Thread veya condition bekleme kodlarında da aşağıdakine benzer satırlar görülebilir.
boost::system_time  timeout = boost::get_system_time( ) + boost::posix_time::milliseconds(1000);

second_clock
boost ile gelen date_time kütüphanesinde second_clock sınıfı ile saniye çözünürlüğünde zaman ölçümü yapabilmek mümkün.

microsec_clock

boost ile gelen date_time kütüphanesindeki microsec_clock sınıfı ile mikrosaniye çözünürlüğünde zaman ölçümü yapabilmek mümkün. Hatta bu kütüphane ile linux/windows arasında portable kod yazabilmek te mümkün. Bu kütüphane Linux üzerinde çalışırken yukarıda bahsedilen gettimeofday() metodunu çağırıyor.
Ancak Windows üzerinde çalışırken ftime() metodunu çağırıyor. ftime() Windows için yeterince iyi aralıkta güncellenmediği için microsec_clock'ın Windows üzerinde mikrosaniye çözünürlüğünde zaman ölçümü için kullanılması bence doğru değil. Buradaki soruda da konuyla ilgili açıklama var.

using namespace boost::posix_time;
ptime now = microsec_clock::local_time();
Bir diğer örnekte ise UTC saat alınmış.
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;
ptime now = microsec_clock::universal_time();

Eğer istenirse boost::posix_time daha az hassasiyetle de kullanılabilir. Örneğin from_time metodu ile yeni bir nesne yaratmak mümkün.
Ancak bu nesne sadece saniye hassasiyetinde olacaktır.

Boost chrono high resolution clock
Bu kütüphane ile nanosaniye çözünürlüğünde zaman ölçümü yapabilmek mümkün.

#include <boost/chrono.hpp>

int main() {
    boost::chrono::high_resolution_clock::time_point t1 = boost::chrono::high_resolution_clock::now();

    boost::chrono::high_resolution_clock::time_point t2 = boost::chrono::high_resolution_clock::now();

    std::cout << boost::chrono::duration_cast<boost::chrono::nanoseconds>(t2-t1) << "\n";
    // boost chrono has more advanced output, .count() isn't needed, nor is manually writing out the units
}


C++11 high resolution clock
chrono sınıfları yazısına taşıdım.

QT
QDateTime::currentDateTime() ile milisaniye çözünürlüğünde zaman ölçümü yapabilmek mümkün. Aşağıdaki şekil QDateTime nesnesinin nasıl çalıştığını gösteriyor.



Java Dili
System.currentTimeMillis :
Bu API 1 Ocak 1970 (UTC) gece yarısından (00:00:00) beri geçen süreyi milisaniye çözünürlüğünde alabilmemizi sağlar. Bu metodun hassasiyeti her zaman çok iyi olmayabilir. Örneğin System.currentTimeMillis() metodunu bir döngü içinde çağırırsak gelen sonuçlarda 10-20-30 milisaniyelik atlamalar görebiliriz. Bu durumu teyit eden bir yazıyı burada görebilirsiniz.
Benim yaptığım küçük bir deneyde de Epoch Converter sitesindeki saniye ile System.currentTimeMillis(); hemen hemen (1374955419 saniye ve 1374955418858 milisaniye) aynı değerleri verdiler.

Java'da Epoch zamanını yerel saat olarak nasıl gösteriyor?
Akış aşağıdaki gibi
DateFormat df = DateFormat.getDateTimeInstance (..) şeklinde formatlama sınıfı çağırılınca
DateFormat arayüzünü gerçekleştiren SimpleDateFormat sınıfı döndürülür. Bu sınıf içinde bir Calendar nesnesi barındırır. Calendar arayüzünü gerçekleştiren GregorianCalendar sınıfı'nın setTime() metodu çağırılınca, bu sınıf kendi içindeki computeFields() metodunu çağırır ve saat dilimin hesaba katarak yerel saati bulur.
Yani her formatlama işleminde UTC saatini yerel saate çeviren hesaplama yapılır.

Javada'ki Date ve etrafındaki sınıfların hiyerarşisini gösteren bir şekli buradan aldım ve aşağıya ekledim.



Aşağıda ise bir başka şekil bulunmakta.


Joda
ReadableInstant sınıfı saat diliminden bağımsız olarak epoch'tan beri geçen süreyi milisaniye olarak alabilmemizi sağlar. Aşağıda bu arayüzün hiyerarşisi var.

Bu sınıf ta altta System.currentTimeMillis(); metodunu kullanır. Örnek:
new DateTime ().getMillis();

C# dili

C# ile 1 Ocak 1970 (UTC) gece yarısından (00:00:00) beri geçen süreyi milisaniye çözünürlüğünde alabilmemizi sağlayan bir metod bulunmamaktadır ancak kolayca da yazılabilir.

TimeSpan timeSpan = DateTime.UtcNow-new DateTime(1970, 1, 1,0,0,0,DateTimeKind.Utc);
long milliSeconds = timeSpan.TotalMilliseconds;

EPOCH'tan Geriye Dönüş

Epoch'tan beri geçen süreyi bazen tekrar bir nesneye çevirmek gerekir. Bunun için aşağıda bazı notlar aldım.

C++ Dili

Boost

ptime someUTC_Time(date(2008, Jan, 1), time_duration(0, 0, 0, 0));

QT

QDateTime::fromTime_t(uint seconds) : Bu metod ile Epoch'tan beri geçen saniyeler tekrar nesneye çevirilebilir.

Java Dili
public Date(long date) : Bu metod ile ile Epoch'tan beri geçen milisaniyeler tekrar nesneye çevirilebilir.
Calendar.setTimeInMillis (long)  : Bu metod ile Epoch'tan beri geçen milisaniyeler tekrar nesneye çevirilebilir.

UTC ve Leap Second (Artık Saniye) 
UTC ve Leap Second yazısına taşıdım

24 Aralık 2014 Çarşamba

Bulanık Mantık - Fuzzy Logic

Giriş
Yapay zeka ile hiç uğraşmadım. Ancak bulanık mantık sürekli duyulan bir kelime.

Bulanık Mantık (Fuzzy Logic) Nedir?
Bulanık mantık küme kavramı (set theory) üzerine kurulu. Günlük hayatta bir kümeye ya aitizdir ya da değilizdir.

Bulanık mantık bir kümeye belli bir oranda (yani kısmi) aidiyet anlayışına dayanır. Boyu 1.75 cm olan bir kişinin kısa insanlar kümesine 0.7 oranında, uzun insanlar kümesine ise 0.4 oranında ait olması iyi bir örnek olabilir.

Aidiyet oranı genellikle 0 ve 1 arasındadır ancak olasılıktaki gibi toplamlarının 1 olması gerekmez!


Task Parallel Library - TaskCompletionSource

TaskCompletionSource
Bu sınıf'ın en çok eski async metoduları Task arayüzüne adapte etmek amacıyla kullanılıyor.

Sınıf kendi içinde bir Task ihtiva eder. TaskCompletionSource nesnesinin SetResult() metodu çağırılınca, içerdiği Task'ın Task.Finish() metodu çağırılır.

Klasik kullanım örnekleri şöyle:
GUI kodunda asynch/await çok kullanılır. Böylece uzun süre işlerde GUI'nin donması engellenir. Uzun süre bir işi arkada thread ile çalıştırmak için klasik örnek

private TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
tcs.Thread.Start(...);
// complete task in event
tcs.SetResult(true);

// wait for task somewhere else
await tcs.Task;
Sadece bekleyen Task
Task.Delay() metodu .Net 4.0 ile geliyor. Eğer elimizde yoksa, Timer sınıfını Task arayüzüne uyarlamak için şöyle yapabiliriz.

public static class TaskExtensions
{
    public static Task Delay(this Task task, TimeSpan timeSpan)
    {
        var tcs = new TaskCompletionSource<bool>();
        System.Timers.Timer timer = new System.Timers.Timer();
        timer.Elapsed += (obj, args) =>
        {
            tcs.TrySetResult(true);
        };
        timer.Interval = timeSpan.Milliseconds;
        timer.AutoReset = false;
        timer.Start();
        return tcs.Task;
    } 
}

Klasik kullanımı dışında tuhaf kullanım şekilleri:

Async olarak tasarlanmış bir arayüzü, sync hale getirmek
Task<Bar> CreateBarAsync()
 {
    var tcs = new TaskCompletionSource<Bar>();
    tcs.SetResult(SynchronousBarCreator());
    return tcs.Task
 }

17 Aralık 2014 Çarşamba

Cloud Computing

Giriş
Cloud Computing (Bulut Bilişim) ile ilgili notlarımı aşağıya ekledim.

Bulut Sistem ve Dağıtık Sistem Arasında Ne Fark Var ?
Dağıtık Sistem (Distributed Computing) büyük bir problemi küçük parçalara bölerek çözmeye yarar. Bulut Bilişim ise daha çok birinden hizmet satın almak olarak düşünülebilir.

Cloud Sağlayıcıları
Dünyadaki bazı cloud sağlayıcıları
Microsoft Azure Services Platform
Amazon Web Services
Google App Engine
ToR Switch
Top of Rack switch ile bilgisayarlar birbirlerine bağlanıyor. Oluşan küme MAC adresi ile haberleşiyor. Farklı ToR kümeleri ve diğer katmanlar IP kullanarak haberleşiyor.

Kavramlar
Şu kavramları da bilmek gerekiyor.
- IaaS is “Infrastructure as a service”. its about computing capacity and servers.

- PaaS” which is “platform as a service”

- SaaS is “Software as a service” which gives you access to a software without any care about the servers or the platform.
Infra Structure as a Service (IaaS)
Infra Structure as a Service (IaaS) yazısına taşıdım

Platform as a service - PaaS
Platform as a service - PaaS yazısına taşıdım

Software as a service - SaaS
Software as a service - SaaS yazısına taşıdım

Data as a service - DaaS
Açıklaması şöyle
Data-as-a-service (DaaS) is a data management strategy and a deployment model that focuses on the cloud to deliver a variety of data-related services such as storage, processing, and analytics. DaaS leverages the popular software-as-a-service (SaaS) paradigm, through which customers are able to use cloud-based software applications delivered over the network rather than deploying dedicated hardware servers for a specific set of tasks on a specific set of data.
Backup-as-a-Service - BaaS
Açıklaması şöyle
Backup-as-a-Service has emerged in recent years in response to this need for agile backup solutions. On-prem boxes can get the job done, but not with the speed, flexibility, and security that organizations need today. As the name suggests, BaaS simplifies the process of transitioning away from on-prem backups by providing cloud solutions specifically for backups.


15 Aralık 2014 Pazartesi

Gof - Bridge Örüntüsü - İki Farklı Nesne Hiyerarşisi Arasında Köprü Vardır

Not : GoF Tasarım Örüntüleri yazısına bakabilirsiniz.

Bridge - Yapısal Örüntü
Bridge kodlarda çok kullanılsa bile ismi bridge olarak geçmez.  İki farklı nesne hiyerarşisi vardır.  Birinci hiyerarşinin kökü, ikinci hiyerarşinin sadece kök nesnesini bilir ve kullanır . 

Böylece ilk hiyerarşideki kalıtan nesneler de aynı diğer hiyerarşiye erişebilir. Yani ikisi arasında bridge (köprü) kurulur 

Örnek - Notification ve NotificationSender Hiyerarşisi 
Elimizde şöyle bir kod olsun. Burada ilk nesne hiyerarşisi tanımlı ve NotificationSender hiyerarşisini kullanıyor
public abstract class Notification {
  NotificationSender notificationSender; //Bridge olarak kullanılan nesne

  public Notification(NotificationSender notificationSender) {
    this.notificationSender = notificationSender;
  }

  abstract public void send();
}

public class PushNotification extends Notification {
  public PushNotification(NotificationSender notificationSender) {
    super(notificationSender);
  }

  @Override
  public void send() {
    notificationSender.sendNotification();
  }
}

public class TextNotification extends Notification {

  public TextNotification(NotificationSender notificationSender) {
    super(notificationSender);
  }

  @Override
  public void send() {
    notificationSender.sendNotification();
  }
}
İkinci hiyerarşi şöyle olsun
public interface NotificationSender {
    public void sendNotification();
}
public class PushNotificationSender implements NotificationSender {
  @Override
  public void sendNotification() {
    ...
  }
}
public class TextNotificationSender implements NotificationSender {
  @Override
  public void sendNotification() {
    ...
  }
}
Örnek - Foo + OutputStream Hiyerarşisi 
Bu örüntü çıktı vermek için sıkça kullanılır. Elimizde bir nesne hiyerarşisi olur. En tepedeki kök nesnede (root object) bir OutputStream soyut nesnesi olur. OutputStream de kendi içinde kalıtım hiyerarşisine sahiptir. FileOutputStream, ByteBufferOutputStream vs. gibi. Böylece kendi nesne hiyerarşim istediğim herhangi bir tipte çıktı verebilir.

Örnek - Tv ve RemoteControl Hiyerarşisi 
Head First Design Pattern kitabındaki örnek şöyle
"Bridge pattern allows you to vary implementation and the abstraction by placing two in separate class hierarchies. "

Implementation : TV <--  Sony
                              |        |- LG
                           (has)
Abstraction : Remote Control <-- Concrete Remote Control
Burada elimizde bir TV nesne hiyerarşisi var. Her Tv'nin bir RemoteControl nesnesi var. Ancak RemoteControl farklı gerçekleştirimlere sahip olabilir. Bu yüzden TV ve RemoteControl soyut sınıflar. Kendi kalıtım hiyerarşileri var, ancak birbirlerini TV ve RemoteControl seviyesinde biliyorlar.

Örnek - Shape ve Renderer Hiyerarşisi 
Elimizde bir Shape hiyerarşisi olsun. En üstteki Shape nesnesi Renderer hiyerarşisini kullanıyor
abstract class Shape {
    protected Renderer renderer;
    public Shape(Renderer renderer) {
        this.renderer = renderer;
    }
    public abstract void draw();
}

// Concrete Shape Implementations
class Circle extends Shape {
    public Circle(Renderer renderer) {
        super(renderer);
    }
    @Override
    public void draw() {
        System.out.print("Drawing Circle: ");
        renderer.renderShape();
    }
}
class Square extends Shape {
    public Square(Renderer renderer) {
        super(renderer);
    }
    @Override
    public void draw() {
        System.out.print("Drawing Square: ");
        renderer.renderShape();
    }
}
Renderer hiyerarşisi de şöyle olsun
// Implementations
interface Renderer {
    void renderShape();
}
class VectorRenderer implements Renderer {
    @Override
    public void renderShape() {
        System.out.println("Rendering shape in vector format.");
    }
}
class RasterRenderer implements Renderer {
    @Override
    public void renderShape() {
        System.out.println("Rendering shape in raster format.");
    }
}



13 Aralık 2014 Cumartesi

Devpts

Devpts Nedir?
Devpts esasen bir dosya sistemi. Pseudo terminal açmaya yarıyor. Pseudo terminal kısaca bizim bildiğimiz text terminali. Text terminali olarak kullanılabilecek bir sürü program var. xterm, telnet, ssh vs. gibi. Her biri ile bir pseudo terminal açmak mümkün.

Kendi terminalimizin kullandı dosyaları görmek için aşağıdaki gibi yapılabilir.
$ ls /proc/$$/fd -l
total 0
lrwx------ 1 muru muru 64 Dec 10 16:15 0 -> /dev/pts/3
lrwx------ 1 muru muru 64 Dec 10 16:15 1 -> /dev/pts/3
lrwx------ 1 muru muru 64 Dec 10 16:15 2 -> /dev/pts/3
lrwx------ 1 muru muru 64 Dec 10 16:15 255 -> /dev/pts/3

Bu dosya sistemine gönderilen çıktı "terminal emulator" tarafından ekran gönderilir.

Shell ve PTS
Shell çalışınca otomatik olarak pts ile ilişkilendirilir. Shell'in çalıştırdığı her uygulama da yukarıdaki pts'i kullanır.

pts'ler Arası İletişim
Pseudo terminaller arasında veri iletişimi de mümkün. Burada dikkat edilirse pts'ler arasında haberleşme için shell devrede değil!

Örnekte echo komutunun çıktısının pts/4'e gönderilince diğer terminalde çıktığı görülebilir.

radu's terminal

pts açmak için API
Pseudo terminal açmak için API çağrıları da kullanılabilir. Burada nasıl yapılacağını anlatan örnekler var. Dikkat edilmesi gereken nokta posix_openpt() çağrısı yapılınca /dev/ptmx device'ının okunması. Bu device ise fstab aracılığıyla Devpts dosya sistemi yüklenince oluşturuluyor.

Karakter cihazı olan TTY'ye uygulanabilen tüm ayarlar, pseudo terminal için mantıklı olmayabilir. Örneğin TTY cihazlarına baud rate atanabiliyor. Pseudo terminale baud rate atasak bile bir etkisi olmaz.


Özetlersek
Bu dosya sistemi genellikle /dev/pts altına kuruluyor ve pseudo (virtual) terminal açmaya yarıyor.