Files
RedBear-OS/tests/pipe.c
T
Jeremy Soller 37b6cd942c Fix pipe
2018-07-14 12:29:18 -06:00

73 lines
1.8 KiB
C

//http://www2.cs.uregina.ca/~hamilton/courses/330/notes/unix/pipes/pipes.html
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
int pid, pip[2];
char instring[20];
char * outstring = "Hello World!";
if (pipe(pip) < 0) {
perror("pipe");
return 1;
}
pid = fork();
if (pid == 0) /* child : sends message to parent*/
{
/* close read end */
close(pip[0]);
/* send 7 characters in the string, including end-of-string */
int bytes = write(pip[1], outstring, strlen(outstring));
/* close write end */
close(pip[1]);
/* check result */
if (bytes < 0) {
perror("pipe write");
return 1;
} else if (bytes != strlen(outstring)) {
fprintf(stderr, "pipe write: %d != %d\n", bytes, strlen(outstring));
return 1;
}
return 0;
}
else /* parent : receives message from child */
{
/* close write end */
close(pip[1]);
/* clear memory */
memset(instring, 0, sizeof(instring));
/* read from the pipe */
int bytes = read(pip[0], instring, sizeof(instring) - 1);
/* close read end */
close(pip[0]);
/* check result */
if (bytes < 0) {
perror("pipe read");
return 1;
} else if (bytes != strlen(outstring)) {
fprintf(stderr, "pipe read: %d != %d\n", bytes, strlen(outstring));
return 1;
} else if (memcmp(instring, outstring, sizeof(outstring)) != 0) {
fprintf(stderr, "pipe read does not match pipe write\n");
return 1;
} else {
printf("%s\n", instring);
}
return 0;
}
return 0;
}