From d46c6d27941a26de14f55a2bbf956219bcc70871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A3=95=E4=BE=9D2439?= <68320855+yuyi2439@users.noreply.github.com> Date: Tue, 23 Jan 2024 23:36:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtty=E7=9A=84buf=E6=BB=A1?= =?UTF-8?q?=E6=97=B6=E5=A7=8B=E7=BB=88=E9=98=BB=E5=A1=9E=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20(#493)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修复tty的buf满时始终阻塞的问题 --- kernel/src/driver/tty/tty_device.rs | 23 ++++++++++++++++++++--- kernel/src/process/mod.rs | 2 +- tools/write_disk_image.sh | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/kernel/src/driver/tty/tty_device.rs b/kernel/src/driver/tty/tty_device.rs index f5c534a7..ab1f26de 100644 --- a/kernel/src/driver/tty/tty_device.rs +++ b/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 = 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(); diff --git a/kernel/src/process/mod.rs b/kernel/src/process/mod.rs index f3008d69..cd17a8a8 100644 --- a/kernel/src/process/mod.rs +++ b/kernel/src/process/mod.rs @@ -823,8 +823,8 @@ impl ProcessControlBlock { pub fn generate_name(program_path: &str, args: &Vec) -> String { let mut name = program_path.to_string(); for arg in args { - name.push_str(arg); name.push(' '); + name.push_str(arg); } return name; } diff --git a/tools/write_disk_image.sh b/tools/write_disk_image.sh index addcc79b..6f112a78 100644 --- a/tools/write_disk_image.sh +++ b/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分区