⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 docmd.c

📁 eybuild-x86-arm920t-2.6.7.tar 很好的嵌入式WEB开发环境
💻 C
字号:
#include <stdio.h>#include <string.h>#include <stdlib.h>#ifdef WIN32#include <direct.h>#include <windows.h>#else#include <stdio.h>#include <unistd.h>#include <sys/time.h>#include <pthread.h>#define HANDLE  void *#endif#undef HAVE_FASTCGI#include <eblib.h> typedef struct {    char *      cmd;    char *      path;    char *      errmsg;    HANDLE 		evtTerminate;} PARAMETER;#ifndef WIN32static int              done;static pthread_mutex_t  mutex;static pthread_cond_t   cond;    static int work_thread(void * param){    PARAMETER * p_param = (PARAMETER *)param;    int                 ret = 0;    char		psBuffer[128] = "";    char		buff[1024] = "";    FILE *		fp;        chdir(p_param->path);    putenv("CONTENT_LENGTH=0");    if(NULL == (fp=popen(p_param->cmd, "r")))    {        done = ERROR;        sprintf(p_param->errmsg, "命令执行失败");    }    else    {    	/* Read pipe until end of file */    	while( !feof( fp ) )    	{    	    char *		s;    	    int			i;    	        	    if(NULL == fgets(s=psBuffer, 128, fp))    	        continue;        	    for (i=0; *s; s++)    	    {    	        switch(*s) {    	        case '\n':    	            strcpy(buff+i, "\r\n");    	            i += 2;    	            if ('\r' == s[1])    	                s++;    	            break;    	        case '\r':    	            strcpy(buff+i, "\r\n");    	            i += 2;    	            if ('\n' == s[1])    	                s++;    	            break;    	        default:    	            buff[i++] = *s;    	        }    	    }    	        	    buff[i] = '\0';    	    print("%s", buff);    	}        pclose( fp );    }        pthread_mutex_lock(&mutex);    done = TRUE;        ret = pthread_cond_signal(&cond);        pthread_mutex_unlock (&mutex);    return OK;}int exec_cmd(char *pcmd, char * path, int maxtime, char * errmsg){    PARAMETER           param;    struct timespec     timeout;    struct timeval      now;    pthread_t           subthread;    int                 ret = 0;        param.cmd = pcmd;    param.path = path;    param.errmsg = errmsg;        pthread_mutex_init (&mutex,NULL);    pthread_cond_init(&cond, NULL);        pthread_create(&subthread, NULL, (void *)&work_thread, &param);        pthread_mutex_lock (&mutex);    ret = gettimeofday(&now, NULL);    timeout.tv_sec = now.tv_sec + maxtime;    timeout.tv_nsec = now.tv_usec * 1000;    if (!done)     {        ret = pthread_cond_timedwait(&cond, &mutex, &timeout);            /* fprintf(stderr, "<<< ret = %d\n", ret); */    }        if (!done)        strcpy(errmsg, "命令被强制终止");            pthread_mutex_unlock (&mutex);    pthread_cond_destroy(&cond);    pthread_mutex_destroy(&mutex);        return ret;}#else /* WIN32 */DWORD WINAPI do_cmd_proc(LPVOID lpParameter){    PARAMETER * p_param = (PARAMETER *)lpParameter;    char		psBuffer[128] = "";    char		buff[1024] = "";    FILE *		fp;    chdir(p_param->path);    putenv("CONTENT_LENGTH=0");    if( (fp = popen(p_param->cmd, "rb" )) == NULL )    {        sprintf(p_param->errmsg, "命令执行失败");        SetEvent(p_param->evtTerminate);        return 0;    }    /* Read pipe until end of file */    while( !feof( fp ) )    {        char *		s;        int			i;                if(NULL == fgets(s=psBuffer, 128, fp))            continue;        for (i=0; *s; s++)        {            switch(*s) {            case '\n':                strcpy(buff+i, "\r\n");                i += 2;                if ('\r' == s[1])                    s++;                break;            case '\r':                strcpy(buff+i, "\r\n");                i += 2;                if ('\n' == s[1])                    s++;                break;            default:                buff[i++] = *s;            }        }                buff[i] = '\0';        print("%s", buff);    }    pclose( fp );        SetEvent(p_param->evtTerminate);    return OK;   }int exec_cmd(char *pcmd, char * path, int maxtime, char * errmsg){    PARAMETER           param;    DWORD				ThreadID;    HANDLE				handleRet;    int					ret;    SECURITY_ATTRIBUTES sa;    /* apache used DETACHED_PROCESS when create process */    AllocConsole();    param.cmd = pcmd;    param.path = path;    param.errmsg = errmsg;        param.evtTerminate = CreateEvent(NULL, FALSE, FALSE, "Terminate");    sa.nLength=sizeof(sa);    sa.lpSecurityDescriptor=0;    sa.bInheritHandle=TRUE;        handleRet = CreateThread(0, 0, do_cmd_proc, &param, 0, &ThreadID);    /* convert to second */    if (maxtime <= 0)        maxtime = 5;	/* five second */    maxtime *= 1000;	    ret = WaitForSingleObject(param.evtTerminate, maxtime);    if (WAIT_TIMEOUT == ret)    {        strcpy(errmsg, "命令被强制终止");        TerminateThread(handleRet, 0);        CloseHandle(handleRet);        return ERROR;    }        return OK;}#endif /* WIN32 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -