Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
#include
#include
#include
#include
#include
#include
#include
#include
#define SLEEP_NSEC 10000 // 0.01s
int main (int argc, char **argv) {
char ** cmd = &argv[1];
// set timer
struct timeval start, end;
gettimeofday (&start, 0);
// fork
pid_t pid = fork ();
if (pid < 0) {
std::fprintf (stderr, "cannot fork.\n"); std::exit (1);
} else if (pid == 0) { // child process
// must not delete this
execvp (cmd[0], cmd);
std::fprintf (stderr, "cannot run %s\n", cmd[0]);
_exit (errno == ENOENT ? 127 : 126);
}
// dislable signals
signal (SIGINT, SIG_IGN);
signal (SIGQUIT, SIG_IGN);
// parent process
size_t mem = 0;
int status;
char statm[32];
std::sprintf (&statm[0], "/proc/%d/statm", static_cast (pid));
do {
FILE *reader = fopen (statm, "r");
size_t dummy (0), vm (0);
std::fscanf (reader, "%ld %ld ", &dummy, &vm); // get resident (see procps)
if (mem < vm) mem = vm;
std::fclose (reader);
if (! vm) break;
} while (! usleep (SLEEP_NSEC));
mem *= getpagesize ();
// stop timer
if (waitpid (pid, &status, 0) == -1)
std::fprintf (stderr, "error waiting for child process.\n");
if ((status & 0xff) == 0x7f)
std::fprintf (stderr, "Command stopped by signal %d\n", (status >> 8) & 0xff);
else if ((status & 0xff) != 0)
std::fprintf (stderr, "Command terminated by signal %d\n", status & 0xff);
else if ((status >> 8) & 0xff)
std::fprintf (stderr, "Command exited with non-zero status %d\n", (status >> 8) & 0xff);
gettimeofday (&end, 0);
std::fprintf (stderr, "elapsed (real): %.3fs; RSS=%.1fM\n",
end.tv_sec - start.tv_sec + (end.tv_usec - start.tv_usec) * 1e-6,
static_cast (mem) / (1024.0 * 1024.0));
// enable signals
signal (SIGINT, SIG_DFL);
signal (SIGQUIT, SIG_DFL);
return 0;
}