linux
linuxC程序中如何获取shell的脚本输出呢?
一、linuxC程序中如何获取shell的脚本输出呢?
你说的是Linux C程序获取shell脚本(命令)输出吧,这里简单介绍3种方式,分别是临时文件、匿名管道和popen函数,感兴趣的朋友可以尝试一下:
临时文件
这种方式最容易实现,基本思想是调用C语言标准库的system函数,运行shell命令或脚本,将输出结果重定向到一个临时文件中,然后读取临时文件,获取shell执行结果,测试代码如下,非常简单,输入参数分别为shell命令(脚本)和临时文件名,最终结果保存在临时文件中:
匿名管道
这种方式主要是管道,先pipe创建一个匿名管道,然后fork创建一个子进程,子进程运行shell命令或脚本,并将标准输出dup到匿名管道的写端,父进程再从匿名管道读端读取数据即可,测试代码如下,非常简单,子进程对应写端,父进程对应读端:
popen函数
这种方式最简单,C标准库专门提供了一个popen函数,可以非常简单的处理调用shell,基本思想创建一个管道,fork一个进程,然后执行shell,而shell的输出可以采用读取文件的方式获得,这种方式既避免了创建临时文件,又不受输出字符数的限制,推荐使用:
目前,就分享这3种Linux C程序获取shell脚本(命令)输出的方式吧,对于日常开发应用来说,完全够用了,只要你有一定的C语言基础,熟悉一下上面的代码,很快就能掌握的,网上也有相关教程和资料,介绍的非常详细,感兴趣的话,可以搜一下,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言进行补充。
二、cmd在返回windows可键入什么命令返回?
1、windows/Linux c++ 获取CMD指令执行的返回结果
无论是在windows还是linux下我们都可以借助popen执行终端指令并获取到返回值。
/// 执行cmd指令并返回结果
string getCmdResult(const string &strCmd)
{
char buf[10240] = {0};
FILE *pf = NULL;
if( (pf = popen(strCmd.c_str(), "r")) == NULL )
{
return "";
}
string strResult;
while(fgets(buf, sizeof buf, pf))
{
strResult += buf;
}
pclose(pf);
unsigned int iSize = strResult.size();
if(iSize > 0 && strResult[iSize - 1] == '\n') // linux
{
strResult = strResult.substr(0, iSize - 1);
}
return strResult;
}
但是值得注意的是,windows下诸多的指令需要管理员的权限才能执行,这是很令人头疼的。
除了上述方法外,我们先大致罗列下windows下可以执行命令行指令的方法:
1、WinExec() ==》无法直接使用管理员权限,无法获取返回信息,只能判断是否执行
QString cmdstr = QString("cmd /c taskkill /im iphelper.exe /t /f");
WinExec(cmdstr.toLatin1().data(), SW_HIDE);
2、ShellExecute()==》可使用管理员权限,无法获取返回信息
ShellExecute(0,"runas", LPCSTR("cmd.exe"),LPCSTR("/c net user administrator /active:yes"),"",SW_HIDE);
3、CreateProcessAsUser()==》可使用管理员权限,无法获取返回信息,可判断是否执行成功
BOOL CreateProcessAsUser(
HANDLE hToken, // handle to a token representing the logged-on user
LPCTSTR lpApplicationName, // pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
BOOL bInheritHandles, // whether new process inherits handles
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);
显然,在我们渴望获取到指令返回的信息时,以上的几种方法都不如人意。考虑到‘runas’方法,那么我们能否既使用管理员权限执行指令的同时获取到指令执行返回结果信息呢?答案是肯定的。
先熟悉下windows的runas指令:
RUNAS 用法:
RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ]
/user:<UserName> program
RUNAS [ [/noprofile | /profile] [/env] [/savecred] ]
/smartcard [/user:<UserName>] program
RUNAS /trustlevel:<TrustLevel> program
/noprofile 指定不应该加载用户的配置文件。
这会加速应用程序加载,但
可能会造成一些应用程序运行不正常。
/profile 指定应该加载用户的配置文件。
这是默认值。
/env 要使用当前环境,而不是用户的环境。
/netonly 只在指定的凭据限于远程访问的情况下才使用。
/savecred 用用户以前保存的凭据。
/smartcard 如果凭据是智能卡提供的,则使用这个选项。
/user <UserName> 应使用 USER@DOMAIN 或 DOMAIN\USER 形式
/showtrustlevels 显示可以用作 /trustlevel 的参数的
信任级别。
/trustlevel <Level> 应该是在 /showtrustlevels 中枚举
的一个级别。
program EXE 的命令行。请参阅下面的例子
示例:
> runas /noprofile /user:mymachine\administrator cmd
> runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc"
> runas /env /user:user@domain.microsoft.com "notepad \"my file.txt\""
注意: 只在得到提示时才输入用户的密码。
注意: /profile 跟 /netonly 不兼容。
注意: /savecred 跟 /smartcard 不兼容。
三、php用什么办法实现异步任务?
php实现异步任务的方法:
通用的异步执行文件 exec.phpsleep(8);
$data = "--- type " . date("Y-m-d H:i:s") . " ---\n";
file_put_contents("../log.txt", $data, FILE_APPEND);
popen
通过 popen() 函数打开进程文件指针,从而能异步执行脚本文件。(只在linux下有效)pclose(popen("php exec.php &", 'r'));
echo 1;
热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...