Я хочу запретить пользователю использовать 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("")
}
}
@Sweeper Я хочу выполнить программу. Я хочу что-то сделать после того, как пользователь нажмет control-c во время выполнения. Я не знаю, что с этим делать.
@Sweeper Я обновляю вопрос
@Sweeper, я уже отредактировал это
Вместо
.main
попробуйте передатьnil
в качестве параметраqueue:
. Я не знаю, что делает этот APIProgressHelper
, который вы используете, но, вероятно, он не запускает основную очередь.