diff --git a/trunk/research/python-subprocess/main.py b/trunk/research/python-subprocess/main.py new file mode 100755 index 000000000..afd67ca81 --- /dev/null +++ b/trunk/research/python-subprocess/main.py @@ -0,0 +1,54 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import sys, shlex, time, subprocess + +cmd = "./python.subprocess 0 800" +args = shlex.split(str(cmd)) +print "cmd: %s, args: %s"%(cmd, args) + +def use_communicate(args, fout, ferr): + process = subprocess.Popen(args, stdout=fout, stderr=ferr) + (stdout_str, stderr_str) = process.communicate() + return (stdout_str, stderr_str) + +def use_poll(args, fout, ferr, timeout): + (stdout_str, stderr_str) = (None, None) + process = subprocess.Popen(args, stdout=fout, stderr=ferr) + starttime = time.time() + while True: + process.poll() + if process.returncode is not None: + (stdout_str, stderr_str) = process.communicate() + break + if timeout > 0 and time.time() - starttime >= timeout: + print "timeout, kill process. timeout=%s"%(timeout) + process.kill() + break + time.sleep(1) + process.wait() + return (stdout_str, stderr_str) +def use_communicate_timeout(args, fout, ferr, timeout): + (stdout_str, stderr_str) = (None, None) + process = subprocess.Popen(args, stdout=fout, stderr=ferr) + starttime = time.time() + while True: + +fnull = open("/dev/null", "rw") +fout = subprocess.PIPE#fnull.fileno() +ferr = subprocess.PIPE#fnull#fnull.fileno() +print "fout=%s, ferr=%s"%(fout, ferr) +#(stdout_str, stderr_str) = use_communicate(args, fout, ferr) +#(stdout_str, stderr_str) = use_poll(args, fout, ferr, 10) +(stdout_str, stderr_str) = use_communicate_timeout(args, fout, ferr, 10) + +def print_result(stdout_str, stderr_str): + if stdout_str is None: + stdout_str = "" + if stderr_str is None: + stderr_str = "" + print "terminated, size of stdout=%s, stderr=%s"%(len(stdout_str), len(stderr_str)) + while True: + time.sleep(1) + +print_result(stdout_str, stderr_str) diff --git a/trunk/research/python-subprocess/python.subprocess.cpp b/trunk/research/python-subprocess/python.subprocess.cpp new file mode 100644 index 000000000..6b409b028 --- /dev/null +++ b/trunk/research/python-subprocess/python.subprocess.cpp @@ -0,0 +1,32 @@ +#include +#include +#include + +/** +# always to print to stdout and stderr. +g++ python.subprocess.cpp -o python.subprocess +*/ +int main(int argc, char** argv) { + if (argc <= 2) { + printf("Usage: <%s> \n" + " %s 50 100000\n", argv[0], argv[0]); + exit(-1); + return -1; + } + + int interval_ms = ::atoi(argv[1]); + int max_loop = ::atoi(argv[2]); + printf("always to print to stdout and stderr.\n"); + printf("interval: %d ms\n", interval_ms); + printf("max_loop: %d\n", max_loop); + + for (int i = 0; i < max_loop; i++) { + fprintf(stdout, "always to print to stdout and stderr. interval=%dms, max=%d, current=%d\n", interval_ms, max_loop, i); + fprintf(stderr, "always to print to stdout and stderr. interval=%dms, max=%d, current=%d\n", interval_ms, max_loop, i); + if (interval_ms > 0) { + usleep(interval_ms * 1000); + } + } + + return 0; +}