如何在没有STDIN和STDOUT的情况下从c执行bash-skript

问题描述

我正在编写一个守护进程,它会在按下蜂鸣器时运行shell-skript或任何其他可执行文件。我需要的大多数东西都工作正常,但是我面临一个奇怪的问题:

我通过execlp调用可执行文件。而且,当我确实打开STDIN和STDOUT时,效果很好。

但是,由于应该完全消除妖魔化,因此在后台,我想在没有任何控制台界面的情况下运行它。但是,一旦我关闭标准接口标识符,execlp就不再起作用。

我用下面的代码片段尝试了它:当它以d作为调试参数运行时,标识符将保持打开状态并且可以工作。否则,事实并非如此。因此,问题是:如何在不使用STDIN和STDOUT的情况下以任何方式运行可执行文件

一些评论

请注意,对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 (将#修改为@)