← man/dev_and_programming
rpcgen — man rpcgen — 80×24
ugur@toprak:~/man/dev_and_programming$man rpcgen
Bölüm 1 Geliştirme & Programlama

rpcgen

Uzak Prosedür Çağrısı (RPC) protokol derleyicisi

Özet

      rpcgen infile
      rpcgen [-D [name=value]] [-A] [-M] [-T] [-K secs] infile
      rpcgen [-L] -c | -h | -l | -m | -t | -Sc | -Ss | [-o outfile] [infile]
      rpcgen -c | nettype [-o outfile] [infile]
      rpcgen -s | netid [-o outfile] [infile]

Açıklama

rpcgen, bir RPC protokolünü gerçeklemek (implement etmek) için C kodu üreten bir araçtır. rpcgen'in girdisi, RPC Dili (Remote Procedure Call Language) olarak bilinen ve C'ye benzeyen bir dildir. rpcgen normalde ilk sözdiziminde olduğu gibi kullanılır; burada bir girdi dosyası alır ve en fazla dört çıktı dosyası üretir. Eğer girdi dosyası (infile) proto.x olarak adlandırılmışsa, rpcgen proto.h içinde bir başlık (header) dosyası, proto_xdr.c içinde XDR rutinleri, proto_svc.c içinde sunucu tarafı taslakları (stubs) ve proto_clnt.c içinde istemci tarafı taslakları üretecektir. -T seçeneği ile proto_tbl.i içinde RPC dağıtım tablosunu (dispatch table) da üretecektir. -Sc seçeneği ile istemci tarafında uzak prosedürlerin nasıl kullanılacağını gösteren örnek kod da üretecektir. Bu kod proto_client.c dosyasında oluşturulacaktır. -Ss seçeneği ile uzak prosedürlerin nasıl yazılacağını gösteren örnek bir sunucu kodu da üretecektir. Bu kod proto_server.c dosyasında oluşturulacaktır.

Oluşturulan sunucu hem port izleyicileri (örneğin inetd veya listen) tarafından hem de kendi başına başlatılabilir. Bir port izleyici tarafından başlatıldığında, yalnızca dosya tanımlayıcısı (file descriptor) 0'ın aktarıldığı taşıma (transport) için sunucular oluşturur. Taşımanın adı PM_TRANSPORT çevre değişkeni ayarlanarak belirtilmelidir. rpcgen tarafından üretilen sunucu yürütüldüğğinde, NETPATH çevre değişkeninde belirtilen tüm taşımalar için sunucu tanıtıcıları (server handles) oluşturur veya ayarlanmamışsa, /etc/netconfig dosyasındaki tüm görünür taşımalar için sunucu tanıtıcıları oluşturur.

Not: Taşımalar derleme zamanında değil, çalışma zamanında seçilir. Sunucu kendi kendine başlatıldığında, varsayılan olarak arka planda (background) çalışır. Sunucu sürecini ön planda (foreground) çalıştırmak için özel bir tanımlama sembolü olan RPC_SVC_FG kullanılabilir. İkinci sözdizimi, daha gelişmiş RPC sunucularının oluşturulmasına olanak tanıyan özel özellikler sunar. Bu özellikler, kullanıcı tarafından sağlanan #defines ve RPC dağıtım tablolarına yönelik desteği içerir. RPC dağıtım tablosundaki girdiler şunları içerir:

  • o prosedüre karşılık gelen servis rutinine işaretçiler (pointers),
  • girdi ve çıktı argümanlarına bir işaretçi,
  • bu rutinlerin boyutu

Bir sunucu, yetkilendirmeyi kontrol etmek ve ardından servis rutinini yürütmek için dağıtım tablosunu kullanabilir; bir istemci kütüphanesi ise bunu depolama yönetimi ve XDR veri dönüştürme ayrıntılarıyla ilgilenmek için kullanabilir.

Yukarıda gösterilen diğer üç sözdizimi, tüm çıktı dosyalarını üretmek yerine yalnızca belirli bir dosyayı üretmek istendiğinde kullanılır. Kullanımlarına ilişkin bazı örnekler aşağıdaki ÖRNEK bölümünde açıklanmıştır. rpcgen -s seçeneği ile yürütüldüğünde, o belirli taşıma sınıfı için sunucular oluşturur. -n seçeneği ile yürütüldüğünde, netid tarafından belirtilen taşıma için bir sunucu oluşturur. Eğer girdi dosyası (infile) belirtilmemişse, rpcgen standart girdiyi kabul eder.

C önişlemcisi (preprocessor) cpp(1), rpcgen tarafından fiilen yorumlanmadan önce girdi dosyası üzerinde çalıştırılır. Her çıktı dosyası türü için rpcgen, rpcgen programcısı tarafından kullanılmak üzere özel bir önişlemci sembolü tanımlar:

RPC_HDR başlık (header) dosyalarına derlenirken tanımlanır

RPC_XDR XDR rutinlerine derlenirken tanımlanır

RPC_SVC sunucu tarafı taslaklarına derlenirken tanımlanır

RPC_CLNT istemci tarafı taslaklarına derlenirken tanımlanır

RPC_TBL RPC dağıtım tablolarına derlenirken tanımlanır

‘%’ ile başlayan her satır, rpcgen tarafından yorumlanmadan doğrudan çıktı dosyasına aktarılır.

Girdi dosyasında (infile) başvurulan her veri türü için rpcgen, veri türünün adının başına “xdr_” dizesi eklenmiş bir rutinin var olduğunu varsayar. Eğer bu rutin RPC/XDR kütüphanesinde mevcut değilse, sağlanmalıdır. Tanımlanmamış bir veri türünün sağlanması, XDR rutinlerinin özelleştirilmesine olanak tanır.

Seçenekler

  • -a: İstemci ve sunucu tarafı için örnek kodlar da dahil olmak üzere tüm dosyaları üretir.

  • -b: SunOS 4.1 tarzı RPC için kod üretir. Varsayılan budur.

  • -C: ANSI C dilinde kod üretir. Bu seçenek aynı zamanda C++ derleyicisi ile derlenebilecek kodlar da üretir.

  • -c: XDR rutinlerine derler.

-D name[=value] Bir sembol adı tanımlar. Kaynaktaki #define yönergesine eşdeğerdir. Eğer bir değer verilmezse, değer 1 olarak tanımlanır. Bu seçenek birden fazla kez belirtilebilir.

  • -h: C veri tanımlarına (bir başlık dosyasına) derler. -T seçeneği, RPC dağıtım tablolarını destekleyen bir başlık dosyası üretmek için birlikte kullanılabilir.

-K secs Varsayılan olarak, rpcgen kullanılarak oluşturulan servisler, bir isteğe hizmet verdikten sonra çıkış yapmadan önce 120 saniye bekler. Bu aralık, -K bayrağı kullanılarak değiştirilebilir. Bir isteğe hizmet verdikten hemen sonra çıkan bir sunucu oluşturmak için “-K 0” kullanılabilir. Hiçbir zaman çıkış yapmayan bir sunucu oluşturmak için uygun argüman “-K -1”dir.

Bir sunucuyu izlerken, AT&T System V Release 4 UNIX aracı listen(1) gibi bazı port izleyicileri, bir hizmet isteğine yanıt olarak her zaman yeni bir süreç başlatır (spawn). Eğer bir sunucunun bu tür bir izleyici ile kullanılacağı biliniyorsa, sunucu işlem tamamlandığında hemen çıkmalıdır. Bu tür sunucular için rpcgen, “-K -1” ile kullanılmalıdır.

  • -L: Sunucu hataları stderr yerine syslog dosyasına gönderilecektir.

  • -l: İstemci tarafı taslaklarına derler.

  • -m: Sunucu tarafı taslaklarına derler, ancak bir main() rutini üretmez. Bu seçenek, geri çağırma rutinleri (callback-routines) yapmak ve başlatma işlemlerini gerçekleştirmek üzere kendi main() rutinlerini yazması gereken kullanıcılar için kullanışlıdır.

  • -N: rpcgen'in yeni stilini (newstyle) kullanır. Bu, prosedürlerin birden fazla argümana sahip olmasına olanak tanır. Ayrıca, C diline çok benzeyen bir parametre aktarma stili kullanır. Dolayısıyla, uzak bir prosedüre argüman aktarırken argümana bir işaretçi değil, argümanın kendisini aktarmanız gerekir. Bu davranış, rpcgen tarafından üretilen eski stil kodlardan farklıdır. Geriye dönük uyumluluk nedeniyle yeni stil varsayılan değildir.

-n netid netid ile belirtilen taşıma için sunucu tarafı taslaklarına derler. netconfig veritabanında netid için bir girdi olmalıdır. Birden fazla taşımaya hizmet veren bir sunucuyu derlemek için bu seçenek birden fazla kez belirtilebilir.

-o outfile Çıktı dosyasının adını belirtir. Belirtilmezse standart çıktı kullanılır (yalnızca -c, -h, -l, -m, -n, -s modlarında).

  • -Sc: Uzak prosedürün kullanımını ve rpcgen tarafından üretilen istemci tarafı taslaklarını çağırmadan önce sunucuya nasıl bağlanılacağını gösteren örnek kod üretir.

  • -Ss: Sunucu tarafındaki uzak prosedürler için iskelet kod (skeleton code) üretir. Uzak prosedürler için gerçek kodu sizin doldurmanız gerekecektir.

-s nettype nettype sınıfına ait tüm taşımalar için sunucu tarafı taslaklarına derler. Desteklenen sınıflar; netpath, visible, circuit_n, circuit_v, datagram_n, datagram_v, tcp ve udp'dir [bu sınıflarla ilişkili anlamlar için rpc(3) kılavuzuna bakın. Not: BSD şu anda yalnızca tcp ve udp sınıflarını desteklemektedir]. Bu seçenek birden fazla kez belirtilebilir. Not: Taşımalar derleme zamanında değil, çalışma zamanında seçilir.

  • -T: RPC dağıtım tablolarını destekleyecek kodu üretir.

  • -t: RPC dağıtım tablosuna derler.

-c, -h, -l, -m, -s ve -t seçenekleri yalnızca belirli bir dosya türünü üretmek için kullanılır; -D ve -T seçenekleri ise geneldir ve diğer seçeneklerle birlikte kullanılabilir.

Notlar

RPC Dili, yapıların (structures) iç içe geçmesini (nesting) desteklemez. Geçici bir çözüm olarak yapılar en üst düzeyde bildirilebilir ve aynı etkiyi elde etmek için adları diğer yapıların içinde kullanılabilir.

Görünürdeki kapsam geçerli olmadığından, program tanımları kullanılırken isim çakışmaları meydana gelebilir. Bunların çoğu programlara, sürümlere, prosedürlere ve türlere benzersiz isimler verilerek önlenebilir.

-n seçeneği ile üretilen sunucu kodu, netid ile belirtilen taşımaya başvurur ve bu nedenle siteye oldukça özgüdür.

Örnek

Şu komut

$ rpcgen -T prot.x

prot.h, prot_clnt.c, prot_svc.c, prot_xdr.c ve prot_tbl.i olmak üzere beş dosyayı üretir.

Aşağıdaki örnek C veri tanımlarını (başlık dosyasını) standart çıktıya gönderir.

$ rpcgen -h prot.x

-DTEST test sürümünü, datagram_n sınıfına ait tüm taşımalar için sunucu tarafı taslaklarını standart çıktıya göndermek için şunu kullanın:

$ rpcgen -s datagram_n -DTEST prot.x

netid tcp ile belirtilen taşıma için sunucu tarafı taslaklarını oluşturmak için şunu kullanın:

$ rpcgen -n tcp -o prot_svc.c prot.x

Ayrıca Bakınız

cpp(1)

Haziran 11, 1995