From: Huseyin Mizan (hmizan@eliop.com.tr)
Date: Wed 03 Mar 2004 - 06:47:32 EST
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
-----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);
> }