From: Linux-Sevenler (velia@linux-sevenler.org)
Date: Wed 03 Mar 2004 - 07:26:50 EST
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);
> > }
>
>
>
>
>
>
>