int main(int argc, char **argv) { int maxjobs = -1; int curjobs = 0; double maxload = -1; int argsatonce = 1; int opt; char **command = calloc(sizeof(char*), argc); char **arguments = NULL; int argidx = 0; int arglen = 0; int cidx = 0; int returncode = 0; int replace_cb = 0; int stdout_fd = 1; int stderr_fd = 2; char *t; while ((argv[optind] && strcmp(argv[optind], "--") != 0) && (opt = getopt(argc, argv, "+hij:l:n:")) != -1) { switch (opt) { case 'h': usage(); break; case 'i': replace_cb = 1; break; case 'j': errno = 0; maxjobs = strtoul(optarg, &t, 0); if (errno != 0 || (t-optarg) != strlen(optarg)) { fprintf(stderr, "option '%s' is not a number\n", optarg); exit(2); } break; case 'l': errno = 0; maxload = strtod(optarg, &t); if (errno != 0 || (t-optarg) != strlen(optarg)) { fprintf(stderr, "option '%s' is not a number\n", optarg); exit(2); } break; case 'n': errno = 0; argsatonce = strtoul(optarg, &t, 0); if (errno != 0 || argsatonce < 1 || (t-optarg) != strlen(optarg)) { fprintf(stderr, "option '%s' is not a positive number\n", optarg); exit(2); } break; default: /* ’?’ */ usage(); break; } } if (replace_cb && argsatonce > 1) { fprintf(stderr, "options -i and -n are incomaptible\n"); exit(2); } if (maxjobs < 0) { #ifdef _SC_NPROCESSORS_ONLN maxjobs = sysconf(_SC_NPROCESSORS_ONLN); #else #warning Cannot autodetect number of CPUS on this system: _SC_NPROCESSORS_ONLN not defined. maxjobs = 1; #endif } while (optind < argc) { if (strcmp(argv[optind], "--") == 0) { int i; optind++; arglen = argc - optind; arguments = calloc(sizeof(char *), arglen); if (! arguments) { exit(1); } for (i = 0; i < arglen; i++) { arguments[i] = strdup(argv[optind + i]); } optind += i; } else { command[cidx] = strdup(argv[optind]); cidx++; } optind++; } if (argsatonce > 1 && ! command[0]) { fprintf(stderr, "option -n cannot be used without a command\n"); exit(2); } pipe_child_stdout = create_pipe_child(&stdout_fd, 1); pipe_child_stderr = create_pipe_child(&stderr_fd, 2); if ((pipe_child_stdout < 0) || (pipe_child_stderr < 0)) exit(1); while (argidx < arglen) { double load; getloadavg(&load, 1); if ((maxjobs == 0 || curjobs < maxjobs) && (maxload < 0 || load < maxload)) { if (argsatonce > arglen - argidx) argsatonce = arglen - argidx; exec_child(command, arguments + argidx, replace_cb, argsatonce, stdout_fd, stderr_fd); argidx += argsatonce; curjobs++; } if (maxjobs == 0 || curjobs == maxjobs) { returncode |= wait_for_child(0); curjobs--; } if (maxload > 0 && load >= maxload) { int r; sleep(1); /* XXX We should have a better * heurestic than this */ r = wait_for_child(WNOHANG); if (r > 0) returncode |= r; if (r != -1) curjobs--; } } while (curjobs > 0) { returncode |= wait_for_child(0); curjobs--; } if (pipe_child_stdout) { kill(pipe_child_stdout, SIGKILL); wait_for_child(0); } if (pipe_child_stderr) { kill(pipe_child_stderr, SIGKILL); wait_for_child(0); } return returncode; }
extern "C" void internal_thread_loop_extern_run() { pthread_mutex_lock(&g_daemon_mutex); #if 0 int child_pid = waitpid(-1, (int*)0, WNOHANG); if (child_pid > 0) { if(child_pid == g_tvrecv_pid) { LOGE("%s tvrecv exit pid:%d\n", __FUNCTION__, child_pid); //erase_child_pid(child_pid); //g_tvrecv_pid = 0; } else if(child_pid == g_tvplay_pid) { LOGE("%s tvplay exit pid:%d\n", __FUNCTION__, child_pid); //erase_child_pid(child_pid); //g_tvplay_pid = 0; } } #endif #if 0 if((g_tvrecv_pid > 0 || g_tvplay_pid > 0) && (g_tvrecv_pid <= 0 || g_tvplay_pid <= 0)) { if (e_playing == g_play_statu) { LOGE("%s line:%d g_tvrecv_pid:%d g_tvplay_pid:%d\n", __FUNCTION__, __LINE__, g_tvrecv_pid, g_tvplay_pid); pthread_mutex_unlock(&g_daemon_mutex); stop_tvcore();//放在后面,因为内部有锁,避免死锁。 return; } pthread_mutex_unlock(&g_daemon_mutex); return; } if (e_stoping == g_play_statu && g_tvplay_pid <= 0 && g_tvrecv_pid <= 0) { g_play_statu = e_stop; } #endif if (e_stop != g_play_statu){ pthread_mutex_unlock(&g_daemon_mutex); return; } /* if (mkfifo("/data/test/fifo1", S_IFIFO | 0666) == -1) { log_printf("mk fifo1 faile errno:%d\n", errno); } if (mkfifo("/data/test/fifo2", S_IFIFO | 0666) == -1) { log_printf("mk fifo2 faile errno:%d\n", errno); } */ //create_pipe_child((char*)"/data/test/tvplay", g_tvplay_pid // , child_tvplay_packet_arrive, erase_pid_child_tvplay, 0); int argc = 0; char argv_arg[12][128]; char argv_value[12][32]; memset(argv_arg, 0, sizeof(argv_arg)); memset(argv_value, 0, sizeof(argv_value)); snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "demuxer"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%s", "+mpegts"); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "vc"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%s", "android"); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "%s", "/data/lnt/fifo1"); argc++; create_pipe_child((char*)"/data/lnt/tvplay2", g_tvplay_pid , child_tvplay_packet_arrive, erase_pid_child_tvplay , 5 , argv_arg[0], argv_value[0] , argv_arg[1], argv_value[1] , argv_arg[2]); argc = 0; memset(argv_arg, 0, sizeof(argv_arg)); memset(argv_value, 0, sizeof(argv_value)); snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "freqency"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_freqency); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "modulation"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_modulation); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "symboRate"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_symboRate); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "org_net_id"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_org_net_id); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "net_id"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_net_id); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "pmtPid"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_pmtPid); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "videoPid"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_videoPid); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "audioPid"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_audioPid); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "pcrPid"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_pcrPid); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "serviceId"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_serviceId); argc++; snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "tsId"); snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_tsId); argc++; // static int g_freqency = 0; // static int g_modulation = 0; // static int g_symboRate = 0; // static int g_pmtPid = 0; // static int g_videoPid = 0; // static int g_audioPid = 0; // static int g_pcrPid = 0; // static int g_serviceId = 0; // static int g_tsId = 0; create_pipe_child((char*)"/data/lnt/tvrecv", g_tvrecv_pid , child_tvrecv_packet_arrive, erase_pid_child_tvrecv , argc * 2 , argv_arg[0], argv_value[0] , argv_arg[1], argv_value[1] , argv_arg[2], argv_value[2] , argv_arg[3], argv_value[3] , argv_arg[4], argv_value[4] , argv_arg[5], argv_value[5] , argv_arg[6], argv_value[6] , argv_arg[7], argv_value[7] , argv_arg[8], argv_value[8] , argv_arg[9], argv_value[9] , argv_arg[10], argv_value[10]); if (g_tvplay_pid > 0 || g_tvrecv_pid > 0) { LOGE("%s line:%d g_tvrecv_pid:%d g_tvplay_pid:%d\n", __FUNCTION__, __LINE__, g_tvrecv_pid, g_tvplay_pid); g_play_statu = e_playing; } pthread_mutex_unlock(&g_daemon_mutex); // set_tvpos(); // set_tvsize(); // set_tvchannel(); }