help on interprocess communication
Conor P. Cahill
cpcahil at virtech.uucp
Tue Feb 20 03:40:06 AEST 1990
In article <6456 at cps3xx.UUCP> bruey at cpsin2.cps.msu.edu () writes:
> pipe(filedes);
> if (fork())
> {
> printf("%d %d are filedes \n",filedes[0],filedes[1]);
> buf = "first message";
> write(filedes[1],buf,14);
> if(fork())
> {
> read(filedes[1],buf1,14);
> printf("in second %s \n",buf1);
> }
> }
Read PIPE(2) which should state something like:
filedes[0] is opened for reading and filedes[1] is opened for writing.
There are also several comments that could be made as to the error
checking that is going on (or isn't going on), but I will just shut up
and give you an example of the use of fork() and pipe() from the
imake sources:
cppit(Imakefile, template, outfd)
char *Imakefile;
char *template;
FILE *outfd;
{
FILE *pipeFile;
int pid, pipefd[2];
#ifdef SYSV
int status;
#else /* !SYSV */
union wait status;
#endif /* !SYSV */
char *cleanedImakefile;
/*
* Get a pipe.
*/
if (pipe(pipefd) < 0)
LogFatal("Cannot make a pipe.", "");
/*
* Fork and exec cpp
*/
pid = vfork();
if (pid < 0)
LogFatal("Cannot fork.", "");
if (pid) { /* parent */
close(pipefd[0]);
cleanedImakefile = CleanCppInput(Imakefile);
if ((pipeFile = fdopen(pipefd[1], "w")) == NULL)
LogFatalI("Cannot fdopen fd %d for output.", pipefd[1]);
fprintf(pipeFile, "#define IMAKE_TEMPLATE\t\"%s\"\n",
template);
fprintf(pipeFile, "#define INCLUDE_IMAKEFILE\t\"%s\"\n",
cleanedImakefile);
fprintf(pipeFile, "#include IMAKE_TEMPLATE\n");
fclose(pipeFile);
while (wait(&status) > 0) {
errno = 0;
#ifdef SYSV
if ((status >> 8) & 0xff)
LogFatalI("Signal %d.", (status >> 8) & 0xff);
if (status & 0xff)
LogFatalI("Exit code %d.", status & 0xff);
#else /* !SYSV */
if (status.w_termsig)
LogFatalI("Signal %d.", status.w_termsig);
if (status.w_retcode)
LogFatalI("Exit code %d.", status.w_retcode);
#endif /* !SYSV */
}
CleanCppOutput(outfd);
} else { /* child... dup and exec cpp */
if (verbose)
showargs(cpp_argv);
dup2(pipefd[0], 0);
dup2(fileno(outfd), 1);
close(pipefd[1]);
execv(cpp, cpp_argv);
LogFatal("Cannot exec %s.", cpp);
}
}
--
+-----------------------------------------------------------------------+
| Conor P. Cahill uunet!virtech!cpcahil 703-430-9247 !
| Virtual Technologies Inc., P. O. Box 876, Sterling, VA 22170 |
+-----------------------------------------------------------------------+
More information about the Comp.lang.c
mailing list