Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSWorkspace'的可靠性如何;谁在运行应用程序?_Objective C_Macos_Cocoa_Objective C++_Nsworkspace - Fatal编程技术网

Objective c NSWorkspace'的可靠性如何;谁在运行应用程序?

Objective c NSWorkspace'的可靠性如何;谁在运行应用程序?,objective-c,macos,cocoa,objective-c++,nsworkspace,Objective C,Macos,Cocoa,Objective C++,Nsworkspace,我想在一段时间后终止一些应用程序的执行。我正在轮询NSWorkspace正在运行的应用程序,以查找缺少可观察的内容(如果应用程序正在运行,它是否会通知任何内容?) 我的问题是,应用程序有时会被终止,有时会在应该关闭的时间后几秒钟(根据内部计时器),有时根本不会终止 我尝试使用terminate和forceTerminate方法 在代码段中,apps_u是包含应用程序名称的字符串向量。它由另一个线程定期更新,并在运行以下代码之前接收其数据。它们都在一个es_处理程序块中运行 NSArray*运行应

我想在一段时间后终止一些应用程序的执行。我正在轮询NSWorkspace正在运行的应用程序,以查找缺少可观察的内容(如果应用程序正在运行,它是否会通知任何内容?)

我的问题是,应用程序有时会被终止,有时会在应该关闭的时间后几秒钟(根据内部计时器),有时根本不会终止

我尝试使用terminate和forceTerminate方法

在代码段中,apps_u是包含应用程序名称的字符串向量。它由另一个线程定期更新,并在运行以下代码之前接收其数据。它们都在一个es_处理程序块中运行

NSArray*运行应用程序=[NSWorkspace sharedWorkspace]。运行应用程序;
用于(常数自动和应用程序:应用程序){

//std::cout在macOS上可靠地终止应用程序取决于许多因素,例如:

  • 权利
  • 应用程序是如何启动的
  • 如果有任何后台应用程序在主应用程序崩溃或被其他进程退出时保持活动状态
  • 例如,您的应用程序可能被允许终止一个应用程序,但是,例如,如果您使用以下plist使用
    KeepAlive
    命令终止由
    launchd
    启动的进程:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>com.bundleidentifierOf.AnUnquitabbleApp</string>
        <key>ProgramArguments</key>
        <array>
            <string>/path/to/the/AnUnquitableApp</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
    </plist>
    
    在终端中列出Mac上运行的所有进程。如果您想知道应用程序是否正在运行,请使用:

    ps -ax | grep "AnUnquitableAppNameHere"
    
    然后你可以用它的PID来杀死它

    kill <PID>
    
    杀死
    这将帮助您确定哪些应用程序可以通过简单的退出信号终止,哪些应用程序需要使用更强的信号终止,而那些应用程序是不公平的,因为终止它们需要您的应用程序可能没有的特权或权利。请阅读
    ps
    kill
    的手册页以了解有关您的tar的更多信息获取应用程序

    macOS上还有许多其他方法可以获得持久性,如果你想了解如何可靠地退出应用程序,你首先需要了解它们是如何获得持久性的

    例如,如果用户具有管理员/超级用户权限,则可以通过在
    /Library/LaunchDaemons
    中安装守护进程来获得持久性。如果您的应用程序没有根权限,则不太可能终止该进程

    除了
    launchd
    plist之外,应用程序保持持久性的另一种方法是,例如,有一个后台应用程序,当主应用程序被迫退出时,该应用程序将重新启动。例如,如果使用
    kill
    杀死最新版本的
    Microsoft Word
    ,您将看到它将由su重新启动呼叫一名助手,该助手将抱怨
    Word
    被迫退出

    杀死一个应用程序最好的方法就是发送一个退出苹果的事件,这是我通常做的

    我不想让你气馁,但你试图实现的目标比一开始看起来要困难得多。即使你成功了,也要记住,用户可能会杀死你的应用程序,这将挫败你试图实现的目标,除非它通过启动plist或其他形式的持久性来保持活力

    现在,如果你想观察哪些应用程序在没有投票的情况下被终止或启动,我绝对建议你阅读

    现在回答你的具体问题:

    “此属性仅在主运行循环在 “共模”


    这意味着您需要有一个运行循环才能更新
    NSRunningApplication
    。如果您有GUI应用程序,则已经为您安装了这样一个循环。如果您的应用程序是CLI,则未安装该循环,您需要自己安装这样一个运行循环。如果您使用的是Objective-C,则可以按照本文中的建议执行操作


    因此,您试图实现的目标有很多警告,在继续之前,您需要了解这些警告。

    您的问题必须有更好的表述,因为我真的不明白您的动机是什么。我经常使用我的应用程序终止应用程序,没有问题,也没有轮询。但是,您需要正确的权利终止应用程序删除给定的应用程序。因此,您需要更好地解释要终止的应用程序类型,以便我们可以帮助您。您是在谈论仅用户登录应用程序,还是在谈论MacOS上运行的任何进程?(实际上,如果要枚举计算机上运行的所有进程,NSRunningApplication是非常无用的).你是在谈论特定的应用程序,还是任何应用程序,不管它是否有捆绑包?我想终止用户应用程序,如Twitter、Whatsapp等。我的动机是限制访问浪费时间的应用程序的软件,但如果一个人想使用这些应用程序,他可以使用几分钟。之后他就不能再使用了。如果他试图打开一个被阻止的应用程序,he是不允许的,程序运行正常。它正在终止一个运行不太好的应用程序。谢谢你详细的回答,我意识到我在最初的帖子中遗漏了一些细节。似乎大多数(可能全部)我想杀死的应用程序没有kill“预防”,因为对其相应的NSRunningApplication调用terminate会成功杀死它们,但有时不会(我无法不断复制此错误,有时会发生)。“如果您有GUI应用程序,则已为您安装了此循环。”-我认为这是关键。我只有一个UIElement(应用程序是代理),没有GUI窗口。如果我在系统托盘中单击我的应用程序图标(屏幕右上角,wifi旁边等),突然,一切都按预期进行。应该终止的应用程序确实是。显然,更新NSWorkspace的应用程序需要与应用程序进行某种交互。是的,因为您需要一个运行循环来接收更新事件。否则,您拥有的信息不会更改。如果没有用户交互
    ps -ax | grep "AnUnquitableAppNameHere"
    
    kill <PID>