关于execlp调用shell后的输出问题?
execlp("/usr/local/nagios/libexec/check_nrpe", "check_nrpe", "-H", ipnum, "-c", argv[1], NULL)
请问下如何把check_nrpe的结果不输出到标准输出里面??
[解决办法]
这个就是进程间的通信问题, 利用管道即可实现,下面是我之前写的一篇文章:
有这样一个场景,我的A程序需要利用另外一个程序,并不是简单的调用,而是与此程序实现交互式的操作,比如cmd.exe。我需要向里面输入命令并且得到结果,怎么办?
这样就涉及到了进程间通信的问题。
我想到利用 CreateProcess 来创建cmd进程, 在这个方法中有一个很复杂的参数,
即 STARTUPINFO 结构体,用来指定新进程的主窗口特性,这个结构体包括了这个程序所使用的输入和输出的缓存句柄:
HANDLE hStdInput;
HANDLE hStdOutput;
在标准输入输出中,hStdInput为键盘缓存的句柄,而hStdOutput为控制台窗口的缓存句柄。
但是我们不是标准输入输出,我们要用自定义的内存来实现,因为这片内存才是我们可控的。管道(Pipe)即是我想要的这段内存。
管道有两个最基本的句柄指针,一个指向读,一个指向写。在写指针进行写操作之后,读指针可以进行读操作。
这样就有了最基本的思路: A程序->cmd.exe_input->执行->cmd.exe_output->A程序
所以需要申明四个变量
m_hWritePipeHandle= NULL;//A程序向管道写
m_hReadPipeShell= NULL;//cmd读取写的内容
m_hWritePipeShell= NULL;//cmd向管道写
m_hReadPipeHandle= NULL; //A程序从管道中读出内容
//建立管道
CreatePipe(&m_hReadPipeHandle, &m_hWritePipeShell, &sa, 0);
CreatePipe(&m_hReadPipeShell, &m_hWritePipeHandle, &sa, 0);
//输入输出绑定
STARTUPINFO si = {0};
si.hStdInput = m_hReadPipeShell;
si.hStdOutput = si.hStdError = m_hWritePipeShell;
//进程建立
CreateProcess(strShellPath, NULL, NULL, NULL, TRUE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
最后,只需要新建两个线程来分别实现对m_hWritePipeHandle的写,和对m_hReadPipeHandle的读,即可
大功告成!
[解决办法]
在执行execlp之前,用open打开欲输出的文件,得到其file descriptor为fd,然后调用dup2(fd, 0),使得标准输出0重定向至新的欲输出的文件,然后调用execlp即可。