2012-05-22 57 views
-3

我最近做了一个程序,该程序应该接受两个环境变量,将它们插入到一个字符串中,然后将该字符串发送给popen,并且大部分时间都可以正常工作,但由于某种原因,它会随机不会每隔一段时间执行一次,所以我只是想知道是否有人看到我可能犯的错误或错误?是什么导致这个程序不能可靠地执行

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[], char *envp[]) { 

    char *output; 
    char *ccode; 
    char *command; 
    char *log; 

    command = malloc(1024); 
    log = malloc(1024); 
    const char *parg = getenv("MCEXEC_ARGS"); 
    const char *pname = getenv("MCEXEC_PLAYERNAME"); 

    if(strcmp(parg,"")==0) { 
     output = "Usage: /staff <message>"; 
     printf("%s\n", output); 
     return 0; 
    } 

    freopen("/dev/null","w",stdout); 

    if (argv[1] == NULL) { 
     snprintf(command, 1024, 
       "/home/minecraft/remoteclient01a.py 'sendmsgtogroup staff §f(§bSTAFF§f) <%s§f> %s'", 
       pname, parg); 
     snprintf(log, 1024, 
       "/home/minecraft/remoteclient01a.py 'savetolog info staffmsg: <%s> %s'", 
       pname, parg); 
    } 
    else if (strcmp(argv[1],"me")==0) { 
     snprintf(command, 1024, 
       "/home/minecraft/remoteclient01a.py 'sendmsgtogroup staff §f(§bSTAFF§f) * %s§f %s'", 
       pname, parg); 
     snprintf(log, 1024, 
       "/home/minecraft/remoteclient01a.py 'savetolog info staffmsg: * %s %s'", 
       pname, parg); 
    } 

    popen(command, "w"); 
    popen(log, "w"); 

    free(command); 
    free(log); 

    return 0; 
} 
+0

您能否包含有关发生什么事以及什么排除程序不能正确执行的任何细节? –

+0

“但由于某种原因,它会随机不会每隔一段时间执行一次” - 它以什么方式“不执行”? – ArjunShankar

+1

你没有处理来自系统调用的任何错误代码,所以你甚至可以期望调试它。 –

回答

3

嗯......

  • 你不检查malloc()成功。
  • 你不处理环境变量可能不存在。
  • 对一个可能为NULL的指针调用strcmp();这可能会在那里杀死你的程序。
  • 您不检查文件是否打开成功。
  • 你在命令字符串中有奇怪的§字符,不确定是否有意使用。
  • 您不检查popen()是否成功。
  • 我不认为你的使用popen()是有道理的;您打开后没有使用管道。
+0

Add to即:'popen'通过shell运行命令,所以不需要进行自己的环境变量扩展。只要使用'$ FOO' ... –

+0

也不检查字符串溢出的'snprintf' ... – Potatoswatter

相关问题