【问题标题】:Can not connect to an already active screen through system() in c无法通过 c 中的 system() 连接到已经处于活动状态的屏幕
【发布时间】:2015-01-22 23:57:00
【问题描述】:

这是我编写的代码部分,用于将 0 填充到在我的一个 Ubuntu 终端选项卡中打开的屏幕会话中。

char command[60];
strcpy( command, "screen -S 8305.pts-1.MYUb  -X stuff $'0'" );
system(command);

它编译得很好,只有一个像这样的警告

ignoring return value of ‘system’,

但在运行时,我收到如下所示的消息:

No screen session found.

我已经尝试过 system() 与其他 shell 命令,它工作得非常好。当您在终端会话而不是 c 代码中运行屏幕命令时,它也可以正常工作。

【问题讨论】:

  • 在什么用户下执行二进制文件?
  • 这正是问题所在。我在输入了 sudo pass 并永久保存的终端中运行代码。请扩展您的评论并将其作为解决方案。谢谢
  • 您可以编辑我发布的带有您的建议的解决方案并将其标记为答案谢谢。

标签: c bash shell gnu-screen


【解决方案1】:

很可能您以与拥有屏幕的用户不同的用户身份运行命令。例如以 sudo 运行二进制文件。

您可以运行ps aux 来查找运行您的二进制文件的用户。

要使系统命令正常工作,您应该以拥有屏幕的用户身份运行它。

【讨论】:

    【解决方案2】:

    我认为问题在于您正在使用 -S 创建一个新的命名屏幕,并使用 -X 向已经运行的屏幕会话提交命令。

    你要么想要:

    system( "screen -S 8305.pts-1.MYUb cmd" );
    

    system( "screen -r 8305.pts-1.MYUb -X cmd" );
    

    仅供参考——我不确定stuff $0 应该是什么,并且在你提供的代码的上下文中不会工作——但我相信与你报告的问题不同。

    来自man(1)页面

    -S 会话名称
    创建新会话时,此选项可用于为会话指定一个有意义的名称。

    -X 将指定的命令发送到正在运行的屏幕会话。

    【讨论】:

    • 我确信我传递给 system() 的屏幕命令,因为它在 bash 终端中运行良好。
    • 您引用的错误消息是您在会话尚未运行时从-X 获得的消息。仅供参考-如果您尝试启动新屏幕并向其中提交命令,则不需要-X。如果您尝试连接到现有会话,请不要使用 -S(创建新会话),而是使用 -r
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2020-05-05
    • 1970-01-01
    • 2016-08-02
    • 2012-01-03
    • 2021-09-13
    相关资源
    最近更新 更多