Остановить пользователя, использующего control-c, чтобы остановить инструмент командной строки в Swift

avatar
Underthestars-zhy
9 августа 2021 в 03:59
126
0
0

Я хочу запретить пользователю использовать Ctrl-c для остановки инструмента командной строки и что-то делать, когда пользователь нажимает Ctrl + c. Я нахожу что-то, но это не работает в swift5

        signal(SIGINT, SIG_IGN)

        let sigintSrc = DispatchSource.makeSignalSource(signal: SIGINT, queue: .main)
        sigintSrc.setEventHandler {
            print("Successfully created")
            exit(0)
        }
        sigintSrc.resume()

sigintSrc.setEventHandler не вызывался.

Весь код:

func updatePM(_ showInfo: Bool, isCreatServer: Bool = false) {
    print("Start update package...")
    let id = ProgressHelper.share.creatProgress { self.printPointProgress($0) }
    
    // TODO: Stop use control-c to broke the clt
    signal(SIGINT, SIG_IGN)

    let sigintSrc = DispatchSource.makeSignalSource(signal: SIGINT, queue: .main)
    sigintSrc.setEventHandler {
        ProgressHelper.share.stopProgress(id)
        ProgressHelper.share.join(id)
        if isCreatServer {
            print("Successfully created")
            self.printSplitLine()
            exit(0)
        } else {
            print("Stop update packages")
        }
    }
    sigintSrc.resume()
    
    do {
        let ssh = try SSH(host: serverConfig.ip, port: serverConfig.port)
        try ssh.authenticate(username: serverConfig.userName, password: serverConfig.password)
        
        if serverConfig.system == .centos {
            if showInfo {
                try ssh.execute("yum -y update")
            } else {
                (_, _) = try ssh.capture("yum -y update")
            }
        } else {
            if showInfo {
                try ssh.execute("apt-get update")
                try ssh.execute("apt-get dist-upgrade -y")
            } else {
                (_, _) = try ssh.capture("apt-get update")
                (_, _) = try ssh.capture("apt-get dist-upgrade -y")
            }
        }
    } catch {
        fatalError(error.localizedDescription)
    }
    
    ProgressHelper.share.stopProgress(id)
    ProgressHelper.share.join(id)
}

// MARK: - Tool

private func printPointProgress(_ id: UUID) {
    while ProgressHelper.share.state(id) {
        ProgressHelper.share.wait(id)
        sleep(1)
        print(".", terminator: "")
        fflush(stdout)
        sleep(1)
        print("\u{0008} \u{0008}", terminator: "")
        fflush(stdout)
        ProgressHelper.share.stopWait(id)
    }
}

private func printSplitLine(_ text: String = "=") {
    if ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0 {
        for _ in 0..<w.ws_col { print(text, terminator: "") }
        print("")
    }
}
Источник
Underthestars-zhy
9 августа 2021 в 06:52
0

@Sweeper Я хочу выполнить программу. Я хочу что-то сделать после того, как пользователь нажмет control-c во время выполнения. Я не знаю, что с этим делать.

Underthestars-zhy
9 августа 2021 в 10:38
0

@Sweeper Я обновляю вопрос

Underthestars-zhy
10 августа 2021 в 04:55
0

@Sweeper, я уже отредактировал это

Sweeper
10 августа 2021 в 05:01
0

Вместо .main попробуйте передать nil в качестве параметра queue:. Я не знаю, что делает этот API ProgressHelper, который вы используете, но, вероятно, он не запускает основную очередь.

Ответы (0)