Skip to content

Commit

Permalink
feat(test_fifo_write): 增强FIFO写入测试,添加非阻塞模式支持和多个测试场景
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaolin2004 committed Nov 27, 2024
1 parent d1e5b8f commit d96a0d2
Showing 1 changed file with 30 additions and 13 deletions.
43 changes: 30 additions & 13 deletions user/apps/test_fifo_write/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include <sys/stat.h>
#include <sys/wait.h>

#define FIFO_PATH "/bin/test_fifo"
#define FIFO_PATH "/bin/test_fifo" // 使用 /tmp 目录避免权限问题

// 信号处理函数
void sigpipe_handler(int signo) {
Expand All @@ -19,9 +19,9 @@ void sigpipe_handler(int signo) {
void test_fifo_write(const char *scenario_desc, int nonblocking) {
int fd;
char *data = "Hello, FIFO!";
printf("\n--- Testing: %s ---\n", scenario_desc);
printf("\n--- Testing: %s (nonblocking=%d) ---\n", scenario_desc, nonblocking);

// 设置 O_NONBLOCK 标志
// 设置写模式和非阻塞模式标志
int flags = O_WRONLY;
if (nonblocking) {
flags |= O_NONBLOCK;
Expand All @@ -45,6 +45,8 @@ void test_fifo_write(const char *scenario_desc, int nonblocking) {
printf("Result: Write failed with EPIPE (no readers available).\n");
} else if (errno == ENXIO) {
printf("Result: Write failed with ENXIO (FIFO never had readers).\n");
} else if (errno == EAGAIN) {
printf("Result: Write failed with EAGAIN (nonblocking write, pipe full or no readers).\n");
} else {
perror("Write failed with an unexpected error");
}
Expand All @@ -56,13 +58,15 @@ void test_fifo_write(const char *scenario_desc, int nonblocking) {
close(fd);
}

void run_tests() {
pid_t reader_pid;
void test_case1(int nonblocking) {
// Case 1: No readers (FIFO never had readers)
test_fifo_write("No readers (FIFO never had readers)", nonblocking);
}

// Case 1: Test with no readers (FIFO never had readers)
test_fifo_write("No readers (FIFO never had readers)", 1);
void test_case2(int nonblocking) {
pid_t reader_pid;

// Case 2: Test with a reader that disconnects
// Case 2: Reader exists but disconnects
reader_pid = fork();
if (reader_pid == 0) {
// 子进程充当读端
Expand All @@ -77,10 +81,14 @@ void run_tests() {
}

sleep(5); // 确保读端已打开
test_fifo_write("Reader exists but disconnects", 0);
test_fifo_write("Reader exists but disconnects", nonblocking);
waitpid(reader_pid, NULL, 0); // 等待读端子进程退出
}

void test_case3(int nonblocking) {
pid_t reader_pid;

// Case 3: Test with an active reader
// Case 3: Active reader exists
reader_pid = fork();
if (reader_pid == 0) {
// 子进程充当读端
Expand All @@ -95,7 +103,7 @@ void run_tests() {
}

sleep(1); // 确保读端已打开
test_fifo_write("Active reader exists", 0);
test_fifo_write("Active reader exists", nonblocking);
waitpid(reader_pid, NULL, 0); // 等待读端子进程退出
}

Expand All @@ -109,8 +117,17 @@ int main() {
exit(EXIT_FAILURE);
}

// 运行测试
run_tests();
// 测试阻塞模式下的三种情况
printf("========== Testing Blocking Mode ==========\n");
test_case1(0); // 阻塞模式下没有读端
test_case2(0); // 阻塞模式下读端断开
test_case3(0); // 阻塞模式下读端存在

// 测试非阻塞模式下的三种情况
// printf("\n========== Testing Nonblocking Mode ==========\n");
// test_case1(1); // 非阻塞模式下没有读端
// test_case2(1); // 非阻塞模式下读端断开
// test_case3(1); // 非阻塞模式下读端存在

// 删除 FIFO
unlink(FIFO_PATH);
Expand Down

0 comments on commit d96a0d2

Please sign in to comment.