Files
RedBear-OS/tests/unistd/pipe.c
T
Tibor Nagy a92be000fb tests: Even more work on error handling
realpath: Fixing undefined behaviour in the second test. If the call fails the resolved_name argument cannot be used for error checking because its state is undefined by SUSv2.
pipe: Changing the order of close and write error handling code. Errors in close could overwrite errno after write errors, returning incorrect error messages.
gmtime: Removed duplicate checks
Other fixes for fseek, rename, mktime, putwchar
2019-02-24 22:02:11 +01:00

77 lines
2.1 KiB
C

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