gpt4 book ai didi

objective-c - 在 objective-C 中发送 control+c (SIGINT) 到 NSPIPE

转载 作者:搜寻专家 更新时间:2023-10-30 20:12:54 25 4
gpt4 key购买 nike

我正在尝试终止通过 NSTask 生成的 openvpn 任务。

我的问题:

我应该将 ctrl+c (SIGINT) 发送到我的 NSTask 的输入 NSPipe 吗?

inputPipe = [NSPipe pipe]; 
taskInput = [inputPipe fileHandleForWriting];
NSString dataString = @"\cC";
[taskInput writeData:[dataString dataUsingEncoding: [NSString defaultCStringEncoding]]];

或者,我正在考虑使用 kill( pid, SIGINT );但它会复杂得多,因为必须通过绕道来确定进程 ID([task processIdentifier] 在这里没有帮助) - 原始 NSTask 调用:

/bin/bash -c sudo -S | mypassword ....

这不太好,我知道,但它只被调用一次,并且在那种情况下已经输入了 sudo 密码。

最佳答案

Control-C 和 SIGINT 不是一回事。

在键盘输入的情况下,操作系统中有一个“tty 驱动程序”,它执行诸如回显字符、处理 delete 键等操作。它也是识别 control-C(或任何你的 intr 字符)并向进程发送 SIGINT 的东西。

当你有一个到另一个进程的管道时,不涉及 tty 驱动程序*,所以 control-C 只是作为普通数据传递。

您需要找到 pid 并直接向其发送 SIGINT。当然,您实际上可能没有向它发送信号的权限(因为您使用 sudo 以 root 身份运行其他任务)...

*除非你使用的是伪终端 (pty),NSPipe 没有,而且你也不想这样做:-)

关于objective-c - 在 objective-C 中发送 control+c (SIGINT) 到 NSPIPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2713152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com