📄 docmd.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, ¶m); 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, ¶m, 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 + -