Bunun Burada Ne İşi Var?
Dün şehre inmek için Sayın Menderes Türel’in zamanında Hafif Metro ...
Bu sene Doç. Dr. Aylin Kantarcı hocamızın verdiği İşletim Sistemleri 2 dersinde, süreçleri (process) ve nasıl işlediklerini ayrıntılı bir şekilde öğrendik. Üzerinde durduğumuz konulardan bir tanesi Inter Process Communication (Süreçler Arası İletişim) idi.
Bize verilen ödevde, iki matrisin çarpma işleminin her satırını bir sürece yaptıracağımız bir program istendi. Bu processler birbirleri ile bir IPC yöntemi olan pipeler ile iletişecekti.
Biz de bu ödevi POSIX arayüzünü kullanan işletim sistemlerine yönelik sistem çağrılarını kullanarak hayata geçirdik.
POSIX: Linuxgiller. Onun için aşağıdaki kod Windows’ta çalışmaz.
Kaynak kodlarını, ödev metnini ve ödev raporunu aşağıdan indirebilirsiniz. Kaynak kodu indirmek istemezseniz yazının devamına göz atabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #define LINE 255 int main() { /* Acilis yazilari BASLANGICI */ printf("Umut BENZER\n"); printf("05-06-7670\n"); printf("Ege Universitesi Bilgisayar Muhendisligi 3. Sinif\n"); printf("http://www.ubenzer.com\n"); printf("Processes\n\n"); /* Acilis yazilari SONU */ int m; int n; int k; int pid; pid = fork(); if (pid == 0) { /* B süreci */ FILE *fp; if((fp=fopen("input.txt","r")) == NULL) { printf ("Dosya acilamadi."); exit(-1); } fscanf(fp,"%d %d %d",&m, &n, &k); int matrisA[m][n]; int matrisB[n][k]; int matrisC[m][k]; int i; int j; for(i=0;i<m;i++) { for(j=0;j<k;j++) { matrisC[i][j] = 0; } } /* A MATRISINI OKU */ for(i=0;i<m;i++) { for(j=0;j<n;j++) { fscanf(fp,"%d",&matrisA[i][j]); } } /* B MATRISINI OKU */ for(i=0;i<n;i++) { for(j=0;j<k;j++) { fscanf(fp,"%d",&matrisB[i][j]); } } fclose(fp); /* EKRANA MATRISLERI YAZDIR */ printf("Matris A:\n"); for(i=0;i<m;i++) { for(j=0;j<n;j++) { printf("%d\t", matrisA[i][j]); } printf("\n"); } printf("\nMatris B:\n"); for(i=0;i<n;i++) { for(j=0;j<k;j++) { printf("%d\t", matrisB[i][j]); } printf("\n"); } int pidler[m]; int pipeler[i][2]; for(i=0;i<m;i++) { if(pipe(pipeler[i]) < 0) fprintf(stderr, "Program coker. %d\n", errno); pidler[i] = fork(); if (pidler[i] == 0) { close(pipeler[i][0]); /* OKuma ucunu kapat */ int ic1,ic2; int temp = 0; for(ic1=0; ic1<k; ic1++) { for(ic2=0; ic2<n; ic2++) { temp += matrisA[i][ic2] * matrisB[ic2][ic1]; } /* integer to char array dönüşümü */ char array[LINE] = {0}; sprintf(array, "%d\n", temp); write(pipeler[i][1],array,LINE); temp = 0; } exit(0); } else if(pidler[i] > 0) { close(pipeler[i][1]); /* Yazma ucunu kapat. */ } else { fprintf(stderr, "Fork yapamadim. %d\n", errno); exit(EXIT_FAILURE); } } for(i=0;i<m;i++) { wait(pidler[i]); } char veribuf[LINE]; for(i=0;i<m;i++) { for(j=0;j<n;j++) { read(pipeler[i][0],veribuf,LINE); matrisC[i][j] = atoi(veribuf); } } printf("\nMatris C:\n"); for(i=0;i<m;i++) { for(j=0;j<k;j++) { printf("%d\t", matrisC[i][j]); } printf("\n"); } exit(0); } else if (pid > 0) { wait(); } else { fprintf(stderr, "Fork yapamadim. %d\n", errno); exit(EXIT_FAILURE); } } |
Twitler yükleniyor... 5 saniye sonra
Bıdı bıdı bıdı bıdı dıdı dıdı dudu dudu hıdı hıdı hödü hödü yüklüyoruz öhüm öhüm bıdı bıdı vs vs... 6 nanosaniye önce
Yüklenmenin geç olmasının sebebi ben değilim, Twitter API'sinin yavaş olması. Gudu gudu hıdı hödö büdü büdü... 25697 asır önce
Ha tabi bunları okumuşsan, bu sitenin çok gizli bir özelliğini bulmuşsun demektir. ;) Tebrikler. Bu "sürpiz yumurta"yı bulduğunu bana da haber verir misin? Tıkla! 6 dinazor önce
Yeni yazıları takip etmenin
bir sürü yolu var!