Today, we demonstrate pipe using a simple example. It is a way to transfer data between different processes created by fork and its descendants. It is a unidirectional way of communication. It is created and handled by kernel and will be controlled by our program.
(read)fdx[0]|<<----------------FDX-----------------------<<|fdx[1](write)
(write)fdy[0]|>>----------------FDY----------------------->>|fdy[1](read)
In the program, we create two pipes FDX and FDY. We send a string "hello world" from parent to child. Sleep for 5 seconds. Send the same string back from child to parent.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> int main() { int fdx[2]; int fdy[2]; char s[20]; int siz,cw,cr; siz=sizeof(s); memset(s,'\0',siz); strcpy(s,"hello world"); pipe(fdx); pipe(fdy); pid_t fk = fork(); if(fk != 0) { cw = write(fdx[1],s,siz); fprintf(stdout,"PIPE FDX: sent %d chars\n",cw); cr = read(fdy[0],s,siz); fprintf(stdout,"PIPE FDY: received -%s- of %d chars\n",s,cr); wait(fk,NULL,0); } else { cr = read(fdx[0],s,siz); fprintf(stdout,"PIPE FDX: received -%s- of %d chars\n",s,cr); fprintf(stdout,"Sleeping for 5 seconds\n"); sleep (5); cw=write(fdy[1],s,siz); fprintf(stdout,"PIPE FDY: sent the received fdx string -%s- of %d chars\n",s,cw); } return (0); } |
Lets skip the library declarations. Breaking down the code.
Preparing String(#13 to #15)
Create string of size 20. Fill it with all NULLs. Initialize with "hello world".
Creating Pipes(#17 and #18)
Creating two pipes fdx and fdy
Forking(#20)
Fork the process
Send Traffic from Parent to Child(#23, #24, #31, #32)
Pass string 's' to write function with (write end of the pipe)fdx[1] and read it in the child with (read end of the pipe)fdx[0].
After sleeping for 5 seconds.
Same string is passed to (write end of pipe)fdy[1] at the child and read in the parent using read function with (read end of the pipe)fdy[0].
Conclusion(#28)
Use wait function to pause the parent till child ends.
Harvesting
When executed the shell shows like this
1 2 3 4 5 6 | # ./a.out PIPE FDX: sent 20 chars PIPE FDX: received -hello world- of 20 chars Sleeping for 5 seconds PIPE FDY: sent the received fdx string -hello world- of 20 chars PIPE FDY: received -hello world- of 20 chars |
No comments:
Post a Comment