无法通过c语言中的system()连接到已激活的屏幕

3

这是我编写的代码部分,用于向我在Ubuntu终端标签页中打开的一个screen会话中填充0。

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代码中运行screen命令时,它也能正常工作。


1
二进制文件是在什么用户下执行的? - cmidi
1
那正是问题所在。我在一个已输入sudo密码并被永久保存的终端中运行代码。请扩展您的评论并将其作为解决方案。谢谢。 - user3684042
你可以根据你的建议编辑我发布的解决方案,并将其标记为答案,谢谢。 - cmidi
2个回答

2

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

您可以运行ps aux查找二进制文件正在以哪个用户身份运行。

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


1
我认为问题在于你使用了-S,它会创建一个新的命名屏幕,而-X则是向已经运行的屏幕会话提交命令。
你可能需要:
system( "screen -S 8305.pts-1.MYUb cmd" );

或者

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

提醒:我不确定stuff $0指的是什么,而且在你提供的代码上下文中不起作用,但我认为这是一个与你报告的问题不同的问题。

来自man(1)页面

-S sessionname
在创建新会话时,可以使用此选项指定会话的有意义名称。

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


我对将传递给system()的screen命令非常确定,因为它在bash终端中运行得非常好。 - user3684042
你引用的错误信息是在会话未运行时使用“-X”命令得到的。顺便说一下,如果你想要启动一个新的屏幕并向其中提交一个命令,你不需要使用“-X”。如果你想连接到一个已经存在的会话,则不要使用“-S”(它会创建一个新的会话),而应该使用“-r”。 - user590028

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接