Explorar o código

修复tty的buf满时始终阻塞的问题 (#493)

* 修复tty的buf满时始终阻塞的问题
裕依2439 hai 1 ano
pai
achega
d46c6d2794
Modificáronse 3 ficheiros con 22 adicións e 5 borrados
  1. 20 3
      kernel/src/driver/tty/tty_device.rs
  2. 1 1
      kernel/src/process/mod.rs
  3. 1 1
      tools/write_disk_image.sh

+ 20 - 3
kernel/src/driver/tty/tty_device.rs

@@ -197,18 +197,35 @@ impl IndexNode for TtyDevice {
 
         self.check_rw_param(len, buf)?;
 
+        let mut cnt: usize = 0;
         // 根据当前文件是stdout还是stderr,选择不同的发送方式
         let r: Result<usize, TtyError> = if data.flags.contains(TtyFileFlag::STDOUT) {
-            self.core.stdout(&buf[0..len], true)
+            loop {
+                let r = self.core.stdout(&buf[cnt..len], false);
+                if let Err(TtyError::BufferFull(c)) = r {
+                    self.sync().expect("Failed to sync tty device!");
+                    cnt += c;
+                } else {
+                    break r;
+                }
+            }
         } else if data.flags.contains(TtyFileFlag::STDERR) {
-            self.core.stderr(&buf[0..len], true)
+            loop {
+                let r = self.core.stderr(&buf[cnt..len], false);
+                if let Err(TtyError::BufferFull(c)) = r {
+                    self.sync().expect("Failed to sync tty device!");
+                    cnt += c;
+                } else {
+                    break r;
+                }
+            }
         } else {
             return Err(SystemError::EPERM);
         };
 
         if r.is_ok() {
             self.sync().expect("Failed to sync tty device!");
-            return Ok(r.unwrap());
+            return Ok(cnt + r.unwrap());
         }
 
         let r: TtyError = r.unwrap_err();

+ 1 - 1
kernel/src/process/mod.rs

@@ -823,8 +823,8 @@ impl ProcessControlBlock {
     pub fn generate_name(program_path: &str, args: &Vec<String>) -> String {
         let mut name = program_path.to_string();
         for arg in args {
-            name.push_str(arg);
             name.push(' ');
+            name.push_str(arg);
         }
         return name;
     }

+ 1 - 1
tools/write_disk_image.sh

@@ -74,7 +74,7 @@ if [ ! -f "${root_folder}/bin/${DISK_NAME}" ]; then
         --bios) 
         case "$2" in
                 uefi)
-            sudo ARCH=${ARCH} bash ./create_hdd_image.sh -P MBR #GPT分区
+            sudo ARCH=${ARCH} bash ./create_hdd_image.sh -P MBR #GPT分区    用GPT分区uefi启动不了 内核没有针对gpt分区表来做处理
             ;;
                 legacy)
             sudo ARCH=${ARCH} bash ./create_hdd_image.sh -P MBR #MBR分区