測試IDL程式與其他程式間聯接的問題,因該可分成三個部份:
在測試SPAWN指令時,原希望可以執行類似 A | B 的pipe模式,可是
SPAWN指令無法直接執行,必需以變通的方式來達成,例如先寫一
shell script,其中含有所欲執行的指令, A | B ,再以SPAWN指令來執
行此script。
5.2. Child Processes Communication
IDL中的SPAWN,是產生子processes,而在UNIX中,processes之間是
可以相互做通訊的,所以希望測試其Processes Communication的能力。
IDL在SPAWN出一子process後可以有兩種情形,一種是等子process完
成後IDL才繼續執行,另一種是IDL直接繼續執行但是會建立一雙向的
pipe與子process的標準輸入輸出相連接。5.1.節的情形就是前者,而這
兩種情形中後者才是較有彈性的。以下是一個簡單的例子:
fact.c: #includeextern int errno; /* system error number */ extern char *sys_errlist[]; /* system error messages */ extern int sys_nerr; /* length of sys_errlist */ long fact(); main() { long n=0; float i=0; setbuf(stdout, (char *) 0); /* make sure the output is not buffered */ /* First argument, find out the N of N!*/ if (!fread(&n, sizeof(long), 1, stdin)) goto error; /* calculate the N! */ i=(float) fact(n); /* because the default variable type is float in IDL */ if (!fwrite(&i, sizeof(float), 1, stdout)) goto error; return; error: fprintf(stderr, " test_pipe: %s\n", sys_errlist[errno]); } long fact(n) long n; { if (n<=0) {return(1);} return(n*fact(n-1)); } test_pipe: commands='fact' spawn, commands, unit= unit, /noshell writeu, unit, 5L readu, unit, answer print, '5! = ',answer free_lun, unit In IDL: IDL> @test_pipe 5! = 120.000 IDL>
IDL在UNIX版本中提供一個C程式庫,可以讓使用者使用RPCs與IDL做
通訊。這個C程式庫主要包含以下幾類程式:
以下是一個簡單的例子helloworld.c,他會傳送列印'hello world'的指令
到IDL上:
#include#include #include #include "export.h" #include "rpc_idl.h" main(c,v) int c; char **v; { CLIENT * client; /* Open connection to server */ client = register_idl_client( 0, NULL, NULL ); /* See if server exists */ if( client == NULL ) printf("Can't find server.\n"), exit(1); /* Send command to server */ if(send_idl_command( client, "print, 'hello world'" ) != 1 ) printf("Error encountered sending command!\n"); /* Disconnect from server */ unregister_idl_client( client ); }