/*-------------------------------------------------------------------*/ /* testpipe.c */ /* The pipe system call. */ /*-------------------------------------------------------------------*/ #include #include #include #define BUFFER_SIZE 100 int main(int argc, char *argv[]) { int piPipeFd[2]; int iProducerPid; int iConsumerPid; int iRet; iRet = pipe(piPipeFd); if (iRet == -1) {perror(argv[0]); return 1; } fflush(NULL); iProducerPid = fork(); /* Fork a producer child. */ if (iProducerPid == -1) {perror(argv[0]); return 1; } if (iProducerPid == 0) { /* Producer child */ char pcBuffer[9] = "somedata"; int iBytesWritten = 0; iRet = close(piPipeFd[0]); if (iRet == -1) {perror(argv[0]); exit(1); } while (iBytesWritten < 9) { iRet = write(piPipeFd[1], pcBuffer + iBytesWritten, 9 - iBytesWritten); if (iRet == -1) {perror(argv[0]); exit(1); } iBytesWritten += iRet; } iRet = close(piPipeFd[1]); if (iRet == -1) {perror(argv[0]); exit(1); } exit(0); } fflush(NULL); iConsumerPid = fork(); /* Fork a consumer child. */ if (iConsumerPid == -1) {perror(argv[0]); return 1; } if (iConsumerPid == 0) { /* Consumer child */ char pcBuffer[BUFFER_SIZE]; int iBytesRead = 0; iRet = close(piPipeFd[1]); if (iRet == -1) {perror(argv[0]); exit(1); } while (iBytesRead < 9) { iRet = read(piPipeFd[0], pcBuffer + iBytesRead, 9 - iBytesRead); if (iRet == -1) {perror(argv[0]); exit(1); } iBytesRead += iRet; } iRet = close(piPipeFd[0]); if (iRet == -1) {perror(argv[0]); exit(1); } /* Print the data to make sure it was communicated properly. */ printf("%s\n", pcBuffer); exit(0); } iRet = close(piPipeFd[0]); if (iRet == -1) {perror(argv[0]); return 1; } iRet = close(piPipeFd[1]); if (iRet == -1) {perror(argv[0]); return 1; } return 0; } /* Sample execution: --> testpipe somedata --> */