Q:如何取得已經連接至 Interbase 資料庫的使用者清單?
A:使用 InterBase API 函式: isc_database_info

 參考以下範例:

 /*
  * Name: getConnectedUsers.c
  *
  *
  * It then uses the isc_database_info call to fetch the number
  * of users connected to that database
  *
  *  Brett Bandy, June 1998
  */

 #include 
 #include 
 #include "ibase.h"

 void usage()
 {
   printf("Syntax Error:\n");
   printf("\t getConnectedUsers \n");
   return;
 }

 int main(int argc, char **argv)
 {
   ISC_STATUS isc_status[20];
   isc_db_handle db;
   char dbname[128];
   char infoBuffer[] = {isc_info_user_names};
   char result_buffer[512];
   char *p;
   char userName[32];
   int length;
   char item;
   int i;
   int userNameSize;
   int totalUsers;

   /* init dbhandle */
   db = 0L;

   switch(argc)
   {
     case 1: 
       /* get dbname from user */
       printf("Enter Database to check for connections: ");
       gets(dbname); 
       break;
     case 2:
       /* dbname is passed in */
       strcpy(dbname, argv[1]);
       break;
     default:
          usage();
          return;
   }

   printf("\nAttempting to attach to database:\n\t%s\n\n", dbname);

   isc_attach_database(isc_status, strlen(dbname), dbname, 
                       &db, 0, NULL);
   if(isc_status[0] == 1 && isc_status[1])
   {
     isc_print_status(isc_status);
     exit(1);
   }

   /* now fetch the number of cache buffers database is using */
   isc_database_info(isc_status,
                       &db,                  /* ptr to db handle */
                       sizeof(infoBuffer),   /* size of items buffer */
                       infoBuffer,           /* array of items to retrieve */
                       sizeof(result_buffer),
                       result_buffer);       /* results will be written */
   if(isc_status[0] == 1 && isc_status[1])
   {
     isc_print_status(isc_status);
     exit(1);
   }

   /* initialize totalUsers */
   totalUsers = 0;

   /*
    * Format for this call is:
    * 
    *    1 byte:  type of info item (isc_info_user_names)
    *    2 bytes: length of next item (must use isc_vax_integer 
    *             to get correct byte order)
    *    x bytes: next item which consists of...
    *             1 byte:  length of username
    *             x bytes: username
    *
    */

   /* extract the info from result_buffer */
   /* loop because there can be more that one user */
   for(p = result_buffer; *p != isc_info_end;)
   {

     item = *p++;   /* item return type */

     if(item != isc_info_user_names)
     {
       printf("Error retrieving user names\n");
       return;
     }

     /* this will return the length of the */
     /* item in bytes (length is 2 byte) */
     length = isc_vax_integer(p, 2);  

     /* increment pointer so points to next username */
     p+=2;

     /* username items are stored in pascal style 
        <1 byte for length> */

     /* get length of username */
     userNameSize = isc_vax_integer(p,1);
     p+=1;

     /* copy username from result_buffer to userName char array */
     memcpy(userName, p, length);
     userName[userNameSize] = '\0';

     /* advance p to point to start of next item */
     p+=userNameSize;

     printf("User [%s] is connected\n", userName);
     totalUsers++;
   }

   printf("\nTotal Connected User Count is %d\n", totalUsers);

   isc_detach_database(isc_status, &db);
   if(isc_status[0] == 1 && isc_status[1])
   {
     isc_print_status(isc_status);
     exit(1);
   }
 }

---------- ---------------------- end -------------------------------

    Source: geocities.com/huanlin_tsai/faq

               ( geocities.com/huanlin_tsai)