Paralel Programlamaya Giriş BM-308 Paralel Programlamaya Giriş Bahar 2015 (1. Sunu) (Yrd. Doç. Dr. Deniz Dal)
Kabuk (Shell) İşletim sistemlerinde kullanıcı ile bilgisayar donanımı arasında genel olarak 3 katmandan söz edilebilir. Bu katmanlar; kabuk, sistem çağrıları ve çekirdek olarak adlandırılır.
Kabuk (Shell) Kabuk, kullanıcı ile işletim sistemi çekirdeği arasında bir ara birimdir. Kullanıcı tarafından verilen komutları algılar, yorumlar ve sistem çağrıları yardımıyla çekirdeğe iletir. Çekirdek ise bilgisayar donanımıyla doğrudan etkileşen ve işletim sistemi işlevlerini gerçekleştiren bileşendir. Kabuk, işletim sisteminin kullanıcıya görünen yüzüdür. Birçok kaynakta komut yorumlayıcısı olarak da adlandırılmaktadır.
Kabuk (Shell) Komut satırındaki işaretlerin farklı anlamları vardır. root :~# ya da ddal:~$ $ : Bu işaret sizin sıradan kullanıcı olduğunuzu belirtir. # : root kullanıcısı olduğunuzu belirtir. ~ : Kullanıcının ev dizininde bulunduğunuzu belirtir.
Komut Kabuk üzerinde genel komut kullanımı aşağıdaki gibidir: komut -seçenek(ler) argüman(lar) Komut: Sistemin ne yapacağını söyler. Seçenekler (Options): Komutun işleyiş şeklini değiştirmeye yarar. Eksi (-) işareti ile başlar. Argümanlar (Arguments): Komutun üzerinde işlem yapacağı nesnedir. Örneğin dosya, proses, kullanıcı,...
Komut Seçenekleri -h --help Komutla ilgili yardımcı bilgi verir. Kısa ya da uzun yazılışları olabilir: Kısa yazılış: Tek tire (-) tek harf Uzun yazılış: Çift tire (--) sözcük Çoğu komutta bulunan bazı seçenekler: -h --help Komutla ilgili yardımcı bilgi verir. -v --verbose İşlemin aşamalarını ayrıntılı gösterir. -q --quite Hiçbir mesaj çıkartma. -V --version Komutun sürüm numarasını gösterir.
Komut Örnek komutlar ve komutların argümanlar ile kullanımları: $ date (komut) $ cal 12 2000 (komut ve iki argüman) $ ls -l (komut ve bir seçenek) $ ls -laR (komut ve çok seçenek) $ ls -l -a -R (komut ve çok seçenek) $ ls –la /etc (komut, iki seçenek ve bir argüman)
Dosya Yolları Dosya ya da klasör yolu iki şekilde verilebilir: Mutlak: Kök klasöründen (/) başlayarak. Bağıl: Bulunulan dizine göre. Özel klasör isimleri: . : Bulunulan klasör. .. : Bir üst klasör. - : Bir önceki klasör. ~ : Şu anki kullanıcının ev klasörü. ~kullanıcı : Belirtilen kullanıcının ev klasörü. / : Kök dizini
pwd (present-print working directory) O anda içinde bulunduğunuz dizinin mutlak (tam) yolunu (Full Path) verir. ddal:~$ pwd /home/ddal root:~# pwd /root
cd (change directory) Komutu Bu komut dizinler arasında geçiş yapmayı sağlayan komuttur. Direkt olarak yanına yazdığınız dizine gidebilirsiniz. ddal:$ cd /var/log
cd Komutu ddal:$ cd .. ddal:$ cd ../.. Bulunduğunuz dizinden bir veya birden fazla üst dizine çıkabilirsiniz. ddal:$ cd .. ddal:$ cd ../..
cd Komutu ddal:$ cd ddal:$ pwd /home/ddal ddal:$ cd ~ Direkt olarak kendi ev dizininize gidebilirsiniz. ddal:$ cd ddal:$ pwd /home/ddal ddal:$ cd ~
cd Komutu ddal:$ cd ~kaya ddal:$ pwd /home/kaya Diğer kullanıcıların ev dizinlerine de gidebilirsiniz. ddal:$ cd ~kaya ddal:$ pwd /home/kaya
cd Komutu En son bulunduğunuz dizine geri dönebilirsiniz. ddal:$ cd ~kaya ddal:$ cd -
ls Komutu Bulunduğunuz dizinin içerisindeki dizin (folder) ve dosyaları (file) listeler.
ls Seçenekleri ls -l ayrıntılı bir çıktı sunarken ls -a bütün dosyaların (hidden, dot files) gösterilmesini sağlar.
mkdir (make directory) Komutu mkdir komutu yeni bir dizin oluşturmak için kullanılır.
rm (remove) Komutu rm komutu dosya veya dizin silmek için kullanılır.
rm Seçenekleri -i seçeneği ile dosyaların silinip silinmeyeceği kullanıcıya sorulur. (interactive)
rm Seçenekleri -r seçeneği ile dizinler silinebilir. (recursive) Aynı işi rmdir komutuyla da yapabilirsiniz. (Dizin içerisi boş olmak kaydıyla)
rm Seçenekleri -f (force) parametresiyle onay almadan direkt silme işlemini gerçekleştirirsiniz. Dikkat !!!
cat (concatenate) Komutu Görevi girdileri çıktılara yönlendirmektir. -n --number : Satırları numaralar. Bir metin dosyasındaki metni standart çıktı olan ekrana yönlendirebilir. ddal :$ cat deneme.txt bu bir metin dosyasidir
cp (copy) Komutu ddal:$ cp dosya1 dosya1_kopya Dosyanın 2. kopyasını yaratmak için cp komutu kullanılır. ddal:$ cp dosya1 dosya1_kopya -i seçeneği ile yaratılacak dosyanın etkileşimli olarak yaratılması sağlanır. ddal:$ ls dosya1 dosya2 ddal:$ cp dosya1 dosya2 ddal:$ cp -i dosya1 dosya2 cp: overwrite `dosya2`?y
cp (copy) Komutu -r seçeneği ile dizin kopyalama işlemi gerçekleştirilir.
cp Seçenekleri -i : Hedef dosyanın üzerine yazılması gerekecekse uyar. (interactive) -f : Uyarma (force)
mv (move) Komutu Dosyanın ismini değiştirmek ya da bir dosya veya klasörü taşımak için mv komutu kullanılır. mv komutu dosya ve dizinler için aynı şekilde kullanılır. ddal:$ mv dosya2 dosya3
ssh (secure shell) Komut satırı, uzaktan erişim protokolü ve bu protokol ile iletişim kuran yazılım setidir. Benzerlerinden olan Telnet ile aralarındaki en önemli fark sağlamış olduğu güvenli ve şifrelenmiş kabuk erişimidir. ssh günümüzde tüm Linux ve Unix dağıtımlarında öntanımlı uzaktan erişim aracı olarak kullanılmaktadır. ssh uzaktaki Linux ve Unix makinelerde güvenli bir şekilde kabuk açmamıza ve o makinede kullanıcımıza verilmiş haklar ölçüsünde çalışabilmemize imkan tanır. Ayrıca uzak makineyle güvenli bir şekilde dosya alışverişine de imkan sağlamaktadır.
ssh ssh kullanıcı_ismi@makine_ismi (ya da ip'si) ssh makine_ismi (ya da ip'si) -l kullanıcı_ismi Örneğin; ssh test@192.168.81.12 ssh test@makine.ismi.com ssh 192.168.81.12 -l test ssh makine.ismi.com -l test
ssh ssh yaparken kullanıcı ismi belirtilmezse yerel makinedeki kullanıcı isminiz uzak makineye bağlantı sağlanırken kullanılır. test@lab13:~$ ssh makine test@makine's password:
scp (secure copy) ssh ile dosya transferi yapmak da mümkündür. Bunun için ssh'ın sözdizimine benzer bir şekilde scp komutu kullanılır. Kullanımı; scp dosya_adı kullanıcı@makine_adı:dizin_yolu scp dosya test@192.168.81.12:/tmp/ scp -r dizin test@192.168.81.12:~/
LİNUX ORTAMINDA C++ KODLARININ YAZILMASI, DERLENMESİ VE ÇALIŞTIRILMASI İlk aşamada .cpp uzantılı bir C++ program dosyası oluşturunuz. Bu işlemi touch komutu ile yapabilirsiniz. Örnek: $touch HelloWorld.cpp Daha sonra ya bir komut satırı editörü (vi veya nano gibi) ya da bir grafik editörü (gedit gibi) yardımıyla programınızı yazınız ve kaydediniz. Artık programınızı derleyip çalıştırabilirsiniz. Bu işlem için bizim sistemimizde kurulu bulunan g++ adlı C++ derleyicisinden faydalanabilirsiniz. Örnek: $g++ HelloWorld.cpp
LİNUX ORTAMINDA C++ KODLARININ YAZILMASI, DERLENMESİ VE ÇALIŞTIRILMASI Derleme işlemi başarıyla sonlandırılır ise eğer derlemeyi yaptığınız dizinde a.out adında executable (çalıştırılabilir) bir dosya oluşur. Bu dosyayı komut satırından aşağıdaki gibi çalıştırabilirsiniz. (Programınızın komut satırı argümanı almadığını varsayıyorum.) Örnek: $./a.out Eğer programınızın a.out dışında bir executable dosya adıyla çalıştırılmasını istiyorsanız programınızı şöyle derlemelisiniz. Örnek: $g++ HelloWorld.cpp -o cikti.x Örnek: $./cikti.x
UYGULAMA 1 Kullanıcıdan ekrana kaç kere Hello World yazacağını klavye yoluyla cout ve cin deyimleri ile alan bir C++ programı yazınız, derleyiniz ve calıştırınız. (main fonksiyonu kendine argüman almıyor.) (Dosya adı olarak HelloWorld1.cpp kullanabilirsiniz.)
argc ve argv Parametreleri int main() { return 0; } int main(int argc, char* argv[ ]) { return 0; }
argc ve argv Parametreleri (devam) main fonksiyonu içinde kullanılan argc (argument count) adlı, int veri tipindeki ilk argüman programın çalıştırılması esnasında komut satırından girilen komutların/kelimelerin sayısını belirtir. Örnek: $ ./cikti.x -n 100 Yukarıdaki örnekte argc 3 olarak değerlendirilir. Çalıştırılan programın adı da (./cikti.x) argc nin sayısına katkıda bulunur.
argc ve argv Parametreleri (devam) main fonksiyonu içinde kullanılan argv parametresi ise komut satırından girilen parametrelere (karakter dizileri) pointer tutan bir dizidir. Örnek: $ ./cikti.x -n 100 Yukarıdaki örnekte argv[0] = ./cikti.x argv[1] = -n argv[2] = 100 argv[1][0] = - ve argv[1][1] = n
ÖRNEK Aşağıdaki kod parçası komut satırından çalıştırılan bir C++ programının argümanlarını ekrana basar. Argumanlar.cpp #include <iostream>//cout using namespace std; int main(int argc, char* argv[ ]) { for(int i=0; i < argc; i++) cout<<argv[i]<<endl; return 0; }
atoi ve atof Fonksiyonları Komut satırından girilen her türlü parametre argv dizisi içerisinde string (karakter dizisi) olarak saklanır. (Rakam olarak girildiği düşünülen argümanlar bile.) Yani bütün bu parametreler karakter dizileridir aslında. Bu yüzden bu parametrelerin rakamlara dönüştürülmesi gerektiğinde atoi ve atof fonksiyonlarına ihtiyaç duyulur. atoi (char *str): fonksiyonu kendine argüman olarak aldığı string i integer a çevirir. atof (char *str): fonksiyonu kendine argüman olarak aldığı string i ondalıklı sayıya çevirir. (floating point) atoi ve atof fonksiyonlarını C++ programlarımızın içinde kullanabilmek için standart kütüphaneden <cstdlib> header dosyasını programımızın başına eklemeliyiz. #include <cstdlib>
ÖRNEK for (i=1; i<argc; i++) { if (argv[i][0] == '-') Aşağıdaki C++ kod parçası ne iş yapar? for (i=1; i<argc; i++) { if (argv[i][0] == '-') if (argv[i][1] == 'n') count=atoi(argv[++i]); break; }
UYGULAMA 2 Kullanıcıdan ekrana kaç kere Hello World yazacağını komut satırından argüman olarak alan bir C++ programı yazınız, derleyiniz ve calıştırınız. (main fonksiyonu kendine argüman alıyor.) (Dosya adı olarak HelloWorld2.cpp kullanabilirsiniz.)