/*******************************************************************************/ /* msqClient.cpp -- The client process * The client process for jg163.cc (server processs) * John Gray, Inrerprocess Communications in UNIX, P.162 */ #include "local6.h" int main(void) { key_t key; /* Key value for ftok*/ pid_t cli_pid; /*Process ID*/ int mid, n; /*Message queue ID*/ MESSAGE msg; /* Message structure*/ static char m_key[10]; /*For string version of mid*/ cli_pid = getpid(); if ((key = ftok(".",SEED)) == -1 ){ /*generate the key*/ perror("Client:key generation"); exit(1); } /* Create and gain access to message queue*/ if((mid=msgget(key, 0)) == -1){ mid = msgget(key, IPC_CREAT | 0660); switch(fork()){ case -1: perror("Client: fork"); exit(3); case 0: sprintf(m_key, "%d", mid); /*turn into string*/ execlp("msqSer", "msqSer", m_key, "&",0); perror("Client: exec"); exit(4); } } while (1) { /* forever */ msg.msg_to = SERVER; /*Message type*/ msg.msg_fm = cli_pid; /* Tag with client PID */ write(fileno(stdout), "cmd>", 6); /*Promt*/ memset(msg.buffer, 0x0, BUFSIZ); /*Clear buffer */ n = read(fileno(stdin), msg.buffer, BUFSIZ); if(n==0) /* EOF ?*/ break; if(msgsnd(mid, &msg, sizeof(msg), 0) == -1) { perror("Client: msgsed"); exit(5); } if((n=msgrcv(mid, &msg, sizeof(msg), cli_pid, 0)) != -1) write(fileno(stdout), msg.buffer, strlen(msg.buffer)); } msgsnd(mid, &msg, 0, 0); exit(0); }