浏览代码

feat(test_fifo_write): 增强FIFO写入测试,添加非阻塞模式支持和多个测试场景

xiaolin2004 4 月之前
父节点
当前提交
d96a0d2541
共有 1 个文件被更改,包括 30 次插入13 次删除
  1. 30 13
      user/apps/test_fifo_write/main.c

+ 30 - 13
user/apps/test_fifo_write/main.c

@@ -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) {
@@ -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;
@@ -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");
         }
@@ -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) {
         // 子进程充当读端
@@ -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) {
         // 子进程充当读端
@@ -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); // 等待读端子进程退出
 }
 
@@ -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);