| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- package main
- import (
- "fmt"
- "os"
- "strconv"
- "syscall"
- )
- // 后台执行job
- func cmd_bg(fields []string, stdin *os.File, stdout *os.File, stderr *os.File) {
- if len(fields) == 1 { // 如果没有指定job,则选编号最小的
- if len(jobs) == 0 { // 如果没有job
- panic("bg: no current job") // 则提示错误
- }
- for i := range jobs {
- fields = append(fields, "%"+strconv.Itoa(i))
- break
- }
- }
- for _, jid := range fields[1:] { // 遍历参数
- id, err := strconv.Atoi(jid[1:]) // 字符串转数字
- if err != nil {
- panic("bg: job not found: " + jid)
- }
- _, ok := jobs[id] // 是否有指定编号的job
- if !ok {
- panic("bg: %" + jid[1:] + ": no such job")
- }
- if jobs[id].state == "running" { // job已经在后台执行
- panic("bg: job already in background")
- }
- jobs[id].state = "running" // 修改状态
- jobs[id].cmd.Process.Signal(syscall.SIGCONT) // 向进程发送SIGCONT信号,继续执行
- os.Setenv("!", strconv.Itoa(jobs[id].cmd.Process.Pid)) // 更新最近一次后台进程的pid
- fmt.Fprintf(stdout, "[%d] %d continued\t%s\n", id, jobs[id].cmd.Process.Pid, jobs[id].work)
- }
- }
|