[linux-programlama] Re: Aynı anda ikiiºlem kontrol etmek

---------

From: Linux-Sevenler (velia@linux-sevenler.org)
Date: Wed 03 Mar 2004 - 07:26:50 EST

  • Next message: Gurkan Aslan: "[linux-programlama] Re: Ayný anda ikiiºlem kontrol etmek"

    On Wed, 3 Mar 2004 13:47:32 +0200
    hmizan@eliop.com.tr (Huseyin Mizan) wrote:

    > Selamlar Arkadaslar,
    >
    > Ben uzun zamandır C kullanmıyorum ve fakat bu dili az çok bildiğimi
    > zannediyorun.Bu dili kullanmamamdaki temel şansızlığımın uygulama tabanlı
    > herhangibir yerde çalışmamam olarak düşünüyorum .Bu nedenle eğer arkadaşlar
    > yanlış anlamazlarsa Cumartesi ve pazar veya heriki günden birisi için
    > arkadaşların uygulamalarına katılarak kendimi bu konuda geliştirmek
    > istiyorum.Bu eğer arkadaşları rahatsız etmiyecekse hafta sonları için
    > ofislerinde olabilir anlamında veya hafta içi internet - mail ortamından
    > olabilir.Bu arada bunu iş bulmak için yapmadığımı söylemek isterim (Zaten şu
    > anda Scada ,PLC endüstriyel otomasyon alanında calışıyorum ) .Hem Linux
    > ortamını öğrenmek hemde çok sevdiğim ama bir türlü uygulama fırsatı
    > bulamadığım c programcılığımı geliştirmek için yapıyorum.Bu arada object
    > oriented programlarda iyi olduğumu söyleyebilirim.Bu konuda arkadaşlar
    > yardım edebilirse sevinirim
    >
    > Komik karşılanmayacağımı umarım
    yok ne demek,,

    nerede oturuyorsunuz..

    Ben Gebzede oturuyorum Fabrikada gelip ziyaret edebilirsiniz..

    Kroman Çelik A.Ş.
    Osmangazi tren istasyonu mevkii Gebze

    Not:Gelmeden önce ararsanız iyi olur....Scada plc benimde ilgi alanım ..

    > -----Original Message-----
    > From: linux-programlama-bounce@liste.linux.org.tr
    > [mailto:linux-programlama-bounce@liste.linux.org.tr]On Behalf Of Serdar
    > KÖYLÜ
    > Sent: Wednesday, March 03, 2004 12:26 PM
    > To: linux-programlama@liste.linux.org.tr
    > Subject: [linux-programlama] Re: Aynı anda ikiiºlem kontrol etmek
    >
    >
    > Selamlar Cumleten..
    >
    > > Bilgileriniz için önce çok teşekkürler,,,
    > >
    > > ben fork ile ilgili bir örnek (sws_webserver) bulup oradan yola çıkarak
    > bişi ler yaptım ama şindiki sorunum
    > > fork ile çalışan süreçe bilgi aktaramıyorum
    > > kod şöyle;
    > > lcd_init ();
    > > if (!fork ())
    >
    > Simdi fork() geri donen degerleri 3 farkli sekilde yorumlanir:
    >
    > 1. Eger deger -1 ise, fork is gormemistir.
    > 2. Eger deger 0 ise, siz child process'iniz.
    > 3. Eger deger baska bir seyse, siz ayni process olarak devam ediyorsunuz
    >
    > Simdi genel bir fork anlatici kodu soyle yazabiliriz
    >
    > pid_t pid;
    > int status;
    >
    > pid = fork();
    >
    > if (pid == -1) {
    > . printf("FORK olmadi, biraz daha RAM almak gerekiyor\n");
    > } else {
    > . if (pid == 0) { // Burasi child..
    > // Child kodunu buraya yazin.
    > . } else {
    > . // Main program kodunu buraya yazin.
    > . waitpid(pid, &status, 0); // Boyle yapmazsaniz
    > . // child olunce defunc olur..
    > . }
    > }
    >
    > Oysa asagida da goruldugu gibi, sizin kodunuz sadece child kodu tarafina
    > gidiyor. Gerci boyle yaparakta ayni etkiye ulasirsiniz, ama hic mola
    > vermeden while(1) icinde donup durmak harbi saglam CPU yuku demektir.
    > Programinizin IDLE olacagi sureleri saglamalisiniz.
    >
    >
    > > {
    > > while (1)
    > > {
    > > lcd_update (); buraya lcd_update(line) gibi değiştirdima ama olmadı
    > > }
    > > }
    > > while (1)
    > > {
    > > fd = open_port ();
    > > bufptr = buffer;
    > > while ((nbytes =
    > > read (fd, bufptr,
    > > buffer + sizeof (buffer) - bufptr - 1)) > 0)
    >
    > Simdi burada read()'in ne zaman geri donecegini bilebiliyormusunuz ?
    > Hayir, skb'ler filan derken tam bu noktada bloke olursunuz. Zaten bu tur
    > yurutmeyede blocking I/O denir. Bunun en iyi cozumu, non-blocking I/O ve
    > async signalleri kullanmaktir.
    >
    > Benim bildigim open_port() diye bir fonksiyon yok. Sanirim bir library
    > vs. uygulamasi. Bu yuzden dogru yorumu yapmam zor. Ama gideceginiz yol
    > kabaca:
    >
    > 1. port'u acin, fd elde edin.
    > 2. fd'nin sahibi benim deyin:
    >
    > int fd;
    >
    > int main(...) {
    > ...
    > ...
    > . fcntl(fd, F_SETOWN, getpid());
    >
    > 3. bir signal handler olusturun, soketten okusun:
    >
    >
    > void handler(int a) {
    >
    > buffer_size = read(fd, buffer, size_of_buffer);
    >
    > }
    >
    > 4. Signal handleri kurun:
    >
    > struct sigaction saio; // Signal action
    > saio.sa_handler = handler;
    > saio.sa_flags = 0;
    > sigaction(SIGIO, &saio, 0);
    >
    > 5. ASYNC moda gecirin soketi:
    >
    > fcntl(fd, F_SETFL, FASYNC);
    >
    > Sonra siz isinize bakin, okunacak bir sey geldikce handler() otomatik
    > devreye girer, okur ve buffer'a koyar..
    >
    > Gerci bu bu kadar basittir, ama bazi puf noktalari da vardir. Oncelikle
    > birisi bufferle ugrasirken digeri onu degistirir hale gelebilir ki
    > bilinen race condition mevzusudur. Bu tur sorunlarin en basit cozumude
    > circular buffer veya ayri ayri iki buffer kullanmakla olur. Ha, bu en
    > iyi cozum degildir, ama en kolayidir.
    >
    > Yukarida, eksik fazla yazilmis, atlanmis bir seyler olabilir, ayakustu
    > yaziyorum ama temel prensipleri gostermeye yeter saniyorum..
    >
    > Saygi ve sevgiler..
    >
    > > {
    > > bufptr += nbytes;
    > > if (bufptr[-1] == '\n' || bufptr[-1] == '\r')
    > > close (fd);
    > > break;
    > > }
    > > barkod = strtok (buffer, "P");
    > > sprintf (line, "AA%s%5.5s\n", gettime (), barkod);
    > > printf ("%s", line);
    > > dosya = fopen ("barkod.db", "at");
    > > fprintf (dosya, line);
    > > fclose (dosya);
    > > sprintf (line, " Kroman Celik~Barkod :%5.5s", barkod);
    > > }
    >
    >
    >
    >
    >
    >
    >


  • Next message: Gurkan Aslan: "[linux-programlama] Re: Ayný anda ikiiºlem kontrol etmek"

    ---------

    Bu arsiv hypermail 2.1.6 tarafindan uretilmistir.