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

* 修复tty的buf满时始终阻塞的问题
This commit is contained in:
裕依2439 2024-01-23 23:36:52 +08:00 committed by GitHub
parent 43ef2a0d2b
commit d46c6d2794
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 22 additions and 5 deletions

View File

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

View File

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

View File

@ -74,7 +74,7 @@ if [ ! -f "${root_folder}/bin/${DISK_NAME}" ]; then
--bios) --bios)
case "$2" in case "$2" in
uefi) 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) legacy)
sudo ARCH=${ARCH} bash ./create_hdd_image.sh -P MBR #MBR分区 sudo ARCH=${ARCH} bash ./create_hdd_image.sh -P MBR #MBR分区