Professional Documents
Culture Documents
/******
Açıklama: Bu notları derse çalışırken kendim için yazmıştım, bu sebeple
notlarda eksik ve hatalı kısımların olma ihtimali çok yüksek. FD.
******/
ders notları 1
echo $PWD >> fileName → dosyanın sonuna pwd bilgisini
ekler
ders notları 2
ls -lt → zamana göre sıralar
ders notları 3
herhangi bir sayıda. []
ifadesinde ilk karakter ^ ise bu karakterler hariç
demektir
egrep “^[^abc].*” fileName —> a b ya da c ile
başlamayan
egrep “[fF]un” fileName → fun, Fun. [A-Z]
egrep “a(bc)*” fileName → parantezler gruplama için
kullanılır. a, abc, abcbc, abcbcbc
egrep “[a-z]{3]” fileName → karakterler kendini üç kez
tekrarlayabilir
egrep “m.{2, 4}” fileName → en az iki en az dört kez
a=104946
$varName
${varName} → değişkenin değerine bakma
${varName:—value} → değişkenin değeri
ders notları 4
setlenmemişse value değerini kullan
$varName:=value} → değişkenin değeri
setlenmemişse değişkenin değerini value yap
${varName:?value} → değişkenin değeri
setlenmemişse strerr’e value yazar
${varName:+value} → setlenmişse value değerini
kullan, setlenmemişse null kullan
ders notları 5
b=(*) → çalışma dizinindeki tüm dosyalardan
array yapar. eğer shell eşleşme bulamazsa array *’dan
ibaret olur
y=11
x=20
> myFile → myFile bir script dosyası, onu
çalıştırıyoruz. dosya x ve y değerlerini ekrana
yazdırıyor ama dosyanın bu değerlere erişimi yoktur
y=
x= → ekrana yazılacak olan şey
export x y → değişkenleri export ettik
> myFile
y = 11
x = 20
ders notları 6
echo “my age is $x” → bir değişkeni çift tırnaklı
yerde kullanmak için
echo “date is `date`" -> bir komutu çift tırnak
içerisinde kullanmak için
echo "date is $(date)" -> alternatif
ders notları 7
cat < file1 // file1 içeriğini ekrana
yazar
exec 3<file1; cat &3>file2 // 3 nolu fd’yi file1’a
atadık, ardından 3 nolu fd içeriğini file2’ye aktardık
ls -al >file1 // ls-al’yi file1’e yazar
ls >/dev/fd/1 // ls bilgisini 1 nolu
fd’nin bağlı olduğu kaynağa yazar. /dev/fd/ dizini
sistemdeki fd’lerin tutulduğu yerdir. dizin olduğu
için openla
// kullanılabilir
ls >>/dev/fd/8 // 8 nolu kaynağa append
yaparak yazar.
ders notları 8
sıralar, alfabetik de düzgün sıralar
cut -c2 file1 // her satırın ikinci
karakteri
cut -c2,3 file1 // her satırın 2. ve 3.
karakteri
cut -c2-6 file1 // her satırın 2. 6. arası
karakterleri. 6. karakter dahil değil
cut -d “ “ -f1 // her satırı boşluğa göre
parçalar, ilk parçayı alır
cut -d a -f2 // a karakterine göre
parçalar, ikinci parçayı alır
wc fileName // satır kelime karakter
bilgisi. wc -l → satır, wc -w → kelime, wc -c →
karakter
head -100 // ilk 100 satır
uniq -c // hangi satırın arka arkaya
kaç defa tekrarlandığını yazar
ps // çalışan processleri
listeler
ders notları 9
a=(10 20) // dizi oluşturma
${a[@]} // tüm diziyi belirtir
ders notları 10
egrep “ab*c” fileName // sıfır ya da daha fazla
anlamına gelir. ac, abc, abbc, abbbc.
egrep “.*” fileName // tüm stringler
egrep “^D.*” fileName // D ile başlayan satırları
arar. ^ satır başını gösterir
egrep “.*D$” fileName // D ile biten satırlar. sonda
bulunan $ satır sonunu gösterir
egrep “ab+c” fileName // karakter kendini bir ya da
daha fazla kez tekrarlar. abc, abbc, abbbc.
egrep “ab?c” fileName // karakerin sıfır ya da bir
kez tekrarlanması. ac, abc
(( 100 == 200 ))
echo $? // 1 sonucunu verir
ders notları 11
pwdd
echo $? // 1 sonucunu verir
çünkü böyle bir komut yok
test 10 -eq 20
echo $? // 1 return eder
pipe=”|”
eval ls $pipe wc // ls | wc olarak görür
// örnek kod
eval echo \$$# // argüman yoksa ilk geçişse $0
olarak görür
// ikinci geçişte ise scriptin
ismini yazar
ders notları 12
dizindeki dosyaları ekler. dizinde 49 tane dosya
olduğunu düşünelim
// ilk geçişte $49.
// ikinci geçişse 4. komutu
satırı argümanı9 şeklinde bir çıktı üretir
basename /usr/bin/myscript
$> myscript // dizinden dosyanın ismini
türetir
ders notları 13
şekilde print eder
done
}
lsPath // fonksiyonun çağrılışı
add_two $1 $2
echo $?
a=$(add_two 2 3)
echo $a
// script sonu
> add_two 3 4 // scripte(scriptin adı da add_two)
iki argüman geçtik
// bu argümanlar bodyden sonraki ilk
satırda fonksiyonu çağırmakta kullanıldı
// 7 yazıldı. işlem başarılı oldugu
için $? de 0 yazdı. ardından fonksiyon
// 2 3 ile çağrıldı. 5 değeri ekrana
yazılacaktı ama $()’dan dolayı çıkış a’ya
yönlendirildi
// eğer return satırını yorumdan çıkarırsak $?’a
return değeri yerleşecektir
// fonksiyon içerisinde $1 ilk parametre, $* tüm
parametreler anlamına gelir
ders notları 14
// not: return edilen değer sayısal ise $? ve a=$()’e
geçer, ama string return ediliyorsa $?’ya geçmez.
sistem çağrıları
int main(){
int fd, n;
char buf[10]
printf(”%d”, BUFSIZ) // sistemin buffer
boyutunu tutan global bir değişken
write(2, “bufsize1: “, 10) // 2’nolu fdye yani
stderr’e 10 karakter yaz.
write(1, “bufsize2: “, 10) // stdouta 10 karakter
yaz
ders notları 15
write(STDOUT_FILENO, buf, n); // buf’a
yazılanları stdouta yazar
}
int main(){
int fd, n;
char buf[10]
close(1) // fd=1 serbest bırakılıyor
fd = open(”LS2”, O_WRONLY | O_TRUNC | O_CREATE,
0644) // boş olan ilk fd yani 1 LS2’ye atandı
sprintf(buf, “fd= %d\n”, fd);
ders notları 16
// STDIN_FILENO = 0, STDOUT_FILENO = 1. kütüphane
değişkenleri
if(write(STDOUT_FILENO, buf, n) ≠ n)
// kod stdin’den yazılanı okuyup stdouta yazıyor
printf(”write error”);
if(n < 0)
printf(”read error”);
}}
int main(){
fprintf(stdout “%s “, “ABC”); // buffera
//fork(); // fork ile yeni
bir process oluşturulur. oluşturulan process
parentının bufferındaki verilerin kopyasına sahip olur
write(1, “DEF”, 3); // terminale
fprintf(stderr, “%s “, “GHI”) // terminale
fprintf(stdout, “%d”, getpid()); // buffera
write(2, “JKL”, 3) // terminale
for(i = 1 ; i < 5 ; i++){
fprintf(stdout, “%s”, “235”) // buffera
return 0;
} // DEF GHI JKL ABC pid 235. verilerin
görünme sırası
ders notları 17
int main(){
if(lseek(STDIN_FILENO, 0, SEEK_CUR) == -1) //
eğer stdin bir dosyaya verilmemişse konunlama yapamaz
printf(”cannot seek”)
else
printf(”seek ok”
}
int main(){
int fd;
off_t offset, newoffset;
char *name, buf[BUFSIZ];
int(argc ≠ 3){
exit(1)
}
name = argv[1]
offset = atoi(argv[2])
ders notları 18
new_offset = lseek(fd, offset, SEEK_CUR) // SEEK_CUR
5 karakter ileride, offset 20 olsun mesela
read(fd, buf, 5); // fp 25.
karakteri gösteriyor, okumaya 26. karakterden itibaren
başlanır
buf[5] = 0;
}
int main(){
ders notları 19
if(pid == 0){ // buraya sadece child
process girer
for(pid = 0 ; pid < 20000 ; pid++){ // 5 karakter
toplam 20.000 defa yazılır
write(fd, buf1, 5)
}
}
for(pid = 0; pid < 10000 ; pid++){ // parent
process 10 karakteri 10.000 defa yazar
write(fd, buf2, 10)
}
exit(0)
}
// iki process zaman paylaşımı ile yazar yani ikisinin
yazdıkları karışık sıradadır
// lakin parent child ilişkisi olduğu için ortak fd ve
fp kullanılır bu sebeple
// dosyanın boyutu 200.000 olur (20.000 x 5 + 10.000 x
10)
int main(){
ders notları 20
}
fd = open(”LS”, O_WRONLY, 0644)
for(pid = 0; pid < 10000 ; pid++){
write(fd, buf2, 10)
}
exit(0)
}
// burada her birinde farklı fp ve fd vardır bu
sebeple dosya boyutu 100.000 olur
#define STRSIZ 80
int main(){
int d;
int n = STRSIZ;
char fname[STRSIZ];
char buf[BUFSIZ];
if(argc ≠ 2){
exit(1)
}
ders notları 21
exit(0)
}
int main(){
puts(”begin”)
//printf(”begin”);
fork();
puts(”end”);
//printf(”end”)
} // puts buffera yazar, sonuna
kendiliğinden \n koyacağı için buffer verisi
boşaltılır begin end end yazılır.
// eğer ilk puts comment yapılır,
printf açılırsa printf’in buffera yazdığı veri childa
da aktarılacağı için begin end begin end yazılır
int main(){
int pid;
int status;
print parent pid by getpid
print parent of parent by getppid // parent
shelldir.
pid = fork();
if(pid == 0){ // child buraya girer
sleep(1) // 1 saniye cpu için uzun bir
süredir. bu sırada parentın icrası bitecektir
print child pid by getpid
print parent pid by getppid // 1 sonuç verir,
parentın icrası biteceği için init’in pid’si print
edilir
}
ders notları 22
else{
print parent pid by getpid
print child pid by pid
}
print “abc”
}
// çıkış
125
1304 // shell
125
39 // child
> // parentın icrası bitince shell yeni komut
satırı verir
39
1 // 125 değil 1 çünkü parentın icrası bitti
int main(){
int i = 5;
printf(”%d\n”, i);
execl(”./Y.exe”, “Y.exe”, 0); // buraya gelince
çalıştırılan kod komple değişir
printf(”%d”, i); // önce i değeri
yazılır, ardından hello. bu satır ise hiç
çalıştırılmaz
}
// Y.c
int main(){
printf(”hello”)
}
ders notları 23
int pid;
int status;
print parent pid by getpid
print parent of parent by getppid
pid = fork();
if(pid == 0){ // child buraya
girer
print child pid by getpid
print parent pid by getppid
sleep(1)
print parent pid by getppid
}
else{
print parent pid by getpid
print child pid by pid
wait(&status)
printf(”child is done by status: %d”, status);
}
}
// status eğer parentın en az bir tane çalışan çocuğu
varsa o çocuklardan sadece bir tanesinin icrasının
bitimine kadar bekleme yapar
// çıkış şöyle olacaktır
// parent → shell → parent, child, (childa geçtik,
onun bitmesini bekleyeceğiz), child, parent, sleep,
parent, done.
// burada forkdan önceki kod bitince önce child mı
yoksa önce parent mı icra edileceği konusu
tarifeleyiciye bağlıdır ama mantık aynı.
ders notları 24
bir süreç exec kullanmadan önce oluşturduğu fd'leri exec kullandıktan
sonra farklı bir programda da kullanmaya devam edebilir. sürecin id'si
de değişmeyecektir, o id'nin kullandığı fd'ler replacement işleminden
sonra halen geçerli olacaktır.
ders notları 25