/*-------------------------------------------------------------------*/ /* testpipedup.c */ /* The pipe and dup system calls. */ /*-------------------------------------------------------------------*/ #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 */ iRet = close(piPipeFd[0]); if (iRet == -1) {perror(argv[0]); exit(1); } iRet = close(1); if (iRet == -1) {perror(argv[0]); exit(1); } iRet = dup(piPipeFd[1]); if (iRet == -1) {perror(argv[0]); exit(1); } iRet = close(piPipeFd[1]); if (iRet == -1) {perror(argv[0]); exit(1); } printf("somedata\n"); 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]; iRet = close(piPipeFd[1]); if (iRet == -1) {perror(argv[0]); exit(1); } iRet = close(0); if (iRet == -1) {perror(argv[0]); exit(1); } iRet = dup(piPipeFd[0]); if (iRet == -1) {perror(argv[0]); exit(1); } iRet = close(piPipeFd[0]); if (iRet == -1) {perror(argv[0]); exit(1); } scanf("%s", pcBuffer); /* 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 --> */