问题描述
我正在编写一个守护进程,它会在按下蜂鸣器时运行shell-skript或任何其他可执行文件。我需要的大多数东西都工作正常,但是我面临一个奇怪的问题:
我通过execlp调用可执行文件。而且,当我确实打开STDIN和STDOUT时,效果很好。
但是,由于应该完全消除妖魔化,因此在后台,我想在没有任何控制台界面的情况下运行它。但是,一旦我关闭标准接口标识符,execlp就不再起作用。
我用下面的代码片段尝试了它:当它以d作为调试参数运行时,标识符将保持打开状态并且可以工作。否则,事实并非如此。因此,问题是:如何在不使用STDIN和STDOUT的情况下以任何方式运行可执行文件。
一些评论:
- 对execlp的调用不会返回。这意味着永远不会完成syslog调用,这符合预期。
- 打开STDERR时,什么也没发生。
- 要调用的脚本返回错误代码(出于调试目的,有意识地返回错误代码)。
- 在打开文件处理程序的情况下执行时,我确实看到了引脚的切换,并且等待调用返回了代码的错误代码。
- 在没有文件处理程序的情况下执行时,等待调用返回退出状态成功。
请注意,对execlp的c调用不会返回。因此,在这个小程序中,看起来很成功。
这是c代码:
/** Global Includes: ****************************************************************/
#include <stdio.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <unistd.h>
#include <syslog.h>
#include <sys/wait.h>
/** Main-Function: ******************************************************************/
int main (int argc,char **argv) {
/** Variables: */
pid_t pid,sid;
/** Set up the demon: ***********************************************************/
pid = fork();
if (pid < 0) {
return -2;
}
/** If we got a good PID,then we can exit the parent process: */
if (pid > 0) {
printf("Sturting Deamon as PID %i.\n",pid);
int iStatus;
pid_t pid;
pid = waitpid(-1,&iStatus,0);
if ((pid == 0) || (pid == -1)) {
printf("Client exited unkNown!\n");
}else{
if (WEXITSTATUS(iStatus) == 0) {
printf("Client %i exited success!\n",pid);
}else{
printf("Client %i exited with error!\n",pid);
}
}
return 0;
}
/** Close out the standard file descriptors: */
if ((argv[1][0]) != 'd') {
close(STDIN_FILENO);
close(STDOUT_FILENO);
//close(STDERR_FILENO);
}
/** Open syslog: */
openlog( "BuzzerD",LOG_PID | LOG_CONS | LOG_NDELAY,LOG_LOCAL0 );
/** Try to run: */
execlp("bash","bash","/home/pi/TexPrint","/home/pi/SoLieb.tex",NULL);
syslog(LOG_ERR | LOG_DAEMON,"FAILURE running execlp!");
_exit(1);
}
这是要被称为的清单:
#SOURCE=$1
#TARGET=${SOURCE/tex/pdf}
#echo Compiling $SOURCE to $TARGET and print!
#echo pdflatex $SOURCE
#echo Trying to print $TARGET ...
#echo lp -d brother_MFC_J5930DW $TARGET
#echo .
/home/pi/BuzzerD/buzzerd -l off
sleep 3
/home/pi/BuzzerD/buzzerd -l alive
exit 1
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)