#include
#include
/* The following array (i.e., SAS program) could be generated */
/* dynamically. */
char sasprogram[] = { "
libname output '.';
data output.file;
infile fildes05;
input var1 var2;
run;
proc print data=output.file;
run;"
};
int src[2], /* File descriptors for the SAS source code. */
data[2]; /* File descriptors for the SAS data. */
int saspid; /* Process ID of the child (SAS process). */
void CloseSAS();
main(argc,argv)
int argc;
char **argv;
{
char buf[512]; /* Generic data buffer */
int counter; /* for loop counter */
/* Invoke the SAS System, and give it the SAS program to run */
if (OpenSAS(sasprogram) == -1)
{
fprintf(stderr, "Can't execute The SAS System!!0);
exit(1);
}
/* Generate two columns of integers for SAS input data. */
for(counter=0;counter<5;counter++)
{
sprintf(buf,"%d %d0,counter, counter);
DataToSAS( buf, strlen(buf) );
}
/* Terminate the SAS Process, then exit. */
CloseSAS();
return(0);
}
int OpenSAS(sasprogram)
char *sasprogram;
{
int fd; /* File descriptor returned from fcntl. */
pipe(src); /* The pipe for the SAS source statements. */
pipe(data); /* The pipe for the input data stream. */
if (!(saspid = fork()))
{
/* We're in the child. Reroute the pipes. */
/* Close stdin of the SAS process. */
close(0);
/* Associate stdin with read end of the source pipe (src[0]). */
fcntl(src[0], F_DUPFD, 0);
/* Close both ends of source pipe. */
close(src[0]);
close(src[1]);
close(5); /* Close just in case it is open. */
/* Associate read end of the data pipe with file descriptor 5. */
fd=fcntl(data[0], F_DUPFD, 5);
printf("fd from fcntl=%d0,fd);
/* Close both ends of the data pipe. */
close(data[0]);
close(data[1]);
/* Run the SAS program. */
execlp("sas", "sas", "-stdio", "-nodms", NULL);
}
/* We are in the parent process. Close the unwanted ends of */
/* the pipes; we are closing the read end of the pipe since */
/* both source and data will be "written to" the SAS process. */
close(src[0]);
close(data[0]);
/* If invoking the SAS System failed, */
if (saspid == -1)
{
close( src[1] ); /* close write end of both pipes. */
close( data[1] );
return(-1); /* Return with -1. */
}
/* Send the SAS System the SAS source to run and close the */
/* source pipe. */
write(src[1], sasprogram, strlen(sasprogram));
close(src[1]);
/* Now any data written to the pipe "data[1]" will be sent to */
/* file descriptor #5 of the SAS process. */
return(saspid);
}
/* Send data to the running SAS process. */
int DataToSAS(buf, len)
char *buf;
int len;
{
if (write(data[1], buf, len) != len)
return(-1);
else
return(0);
}
/* Terminate the SAS process, wait for it, and print exit status. */
void CloseSAS()
{
int rc;
close(data[1]);
while (wait(&rc) != saspid);
printf("the SAS process ended with rc= %d0, rc / 256);
}