Mercurial > emacs
changeset 8482:ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
so we can listen for multiple requests.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 08 Aug 1994 07:08:17 +0000 |
parents | b4c5b7658550 |
children | 19dbc8373bec |
files | lib-src/emacsserver.c |
diffstat | 1 files changed, 40 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/lib-src/emacsserver.c Mon Aug 08 04:38:37 1994 +0000 +++ b/lib-src/emacsserver.c Mon Aug 08 07:08:17 1994 +0000 @@ -245,7 +245,7 @@ main () { - int s, infd, fromlen; + int s, infd, fromlen, ioproc; key_t key; struct msgbuf * msgp = (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ); @@ -302,7 +302,25 @@ } } - /* This is executed in the child made by forking above. */ + /* This is executed in the child made by forking above. + Call it c1. Make another process, ioproc. */ + + ioproc = fork (); + if (ioproc == 0) + { + /* In process ioproc, wait for text from Emacs, + and send it to the process c1. + This way, c1 only has to wait for one source of input. */ + while (fgets (msgp->mtext, BUFSIZ, stdin)) + { + msgp->mtype = 1; + msgsnd (s, msgp, strlen (msgp->mtext) + 1, 0); + } + exit (1); + } + + /* In the process c1, + listen for messages from clients and pass them to Emacs. */ while (1) { if ((fromlen = msgrcv (s, msgp, BUFSIZ - 1, 1, 0)) < 0) @@ -313,17 +331,30 @@ else { msgctl (s, IPC_STAT, &msg_st); + + /* Distinguish whether the message came from a client, or from + ioproc. */ + if (msg_st.msg_lspid == ioproc) + { + char code[BUFSIZ]; + int inproc; + + /* Message from ioproc: tell a client we are done. */ + msgp->mtext[strlen (msgp->mtext)-1] = 0; + sscanf (msgp->mtext, "%s %d", code, &inproc); + msgp->mtype = inproc; + msgsnd (s, msgp, strlen (msgp->mtext) + 1, 0); + continue; + } + + /* This is a request from a client: copy to stdout + so that Emacs will get it. Include msg_lspid + so server.el can tell us where to send the reply. */ strncpy (string, msgp->mtext, fromlen); string[fromlen] = 0; /* make sure */ /* Newline is part of string.. */ - printf ("Client: %d %s", s, string); + printf ("Client: %d %s", msg_st.msg_lspid, string); fflush (stdout); - /* Now, wait for a wakeup */ - fgets (msgp->mtext, BUFSIZ, stdin); - msgp->mtext[strlen (msgp->mtext)-1] = 0; - /* strcpy (msgp->mtext, "done");*/ - msgp->mtype = msg_st.msg_lspid; - msgsnd (s, msgp, strlen (msgp->mtext)+1, 0); } } }