Files
alexvoste 1a9fd27a31 push
2026-05-07 02:22:25 +03:00

83 lines
2.5 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/cervus.h>
static int failed = 0;
static void ok(const char *s) { printf(" [OK] %s\n", s); }
static void fail(const char *s) { printf(" [FAIL] %s\n", s); failed = 1; }
int main(int argc, char **argv)
{
(void)argc; (void)argv;
puts("--- test_pipe ---");
int fds[2] = { -1, -1 };
if (pipe(fds) == 0 && fds[0] >= 0 && fds[1] >= 0) ok("pipe() creates two fds");
else { fail("pipe() failed"); return 1; }
printf(" read_fd=%d write_fd=%d\n", fds[0], fds[1]);
{
const char *msg = "hello pipe";
ssize_t w = write(fds[1], msg, strlen(msg));
if (w == (ssize_t)strlen(msg)) ok("write to pipe");
else fail("write to pipe");
char buf[32];
memset(buf, 0, sizeof(buf));
ssize_t r = read(fds[0], buf, sizeof(buf) - 1);
if (r == (ssize_t)strlen(msg) && strcmp(buf, msg) == 0)
ok("read from pipe matches written data");
else fail("read from pipe");
}
close(fds[0]); close(fds[1]);
{
int p[2];
if (pipe(p) != 0) { fail("pipe for fork test"); return 1; }
pid_t child = fork();
if (child < 0) { fail("fork"); return 1; }
if (child == 0) {
close(p[0]);
const char *s = "world";
write(p[1], s, strlen(s));
close(p[1]);
return 0;
}
close(p[1]);
char buf[32]; memset(buf, 0, sizeof(buf));
ssize_t r = read(p[0], buf, sizeof(buf) - 1);
close(p[0]);
int status = 0; waitpid(child, &status, 0);
if (r > 0 && strcmp(buf, "world") == 0) ok("pipe IPC parent<-child");
else fail("pipe IPC");
}
{
int p[2];
if (pipe(p) != 0) { fail("pipe for dup2 test"); return 1; }
pid_t child = fork();
if (child < 0) { fail("fork for dup2"); return 1; }
if (child == 0) {
close(p[0]);
dup2(p[1], 1);
close(p[1]);
const char *s = "from child stdout\n";
write(1, s, strlen(s));
return 0;
}
close(p[1]);
char buf[64]; memset(buf, 0, sizeof(buf));
ssize_t r = read(p[0], buf, sizeof(buf) - 1);
close(p[0]);
int status = 0; waitpid(child, &status, 0);
if (r > 0 && strncmp(buf, "from child stdout", 17) == 0)
ok("dup2 redirects child stdout through pipe");
else fail("dup2 redirect");
}
puts("--- test_pipe done ---");
return failed ? 1 : 0;
}