Program run in child process doesn't loop
我有一个关于从孩子那里阅读stdout的父进程的具体问题。我的问题是,当我运行程序时,子程序应该在循环中多次执行一个新程序,但它只运行一次并退出到父进程。子进程正在运行一个向stdout输出消息的简单程序。
提前致谢。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | </p> <p> #include <sys/types.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include #include <time.h> #include <sys/wait.h> #define ssec 1 #define fsec 0 #define secBuf 5 #define decbase 10 #define fgbuf 60 </p> <p> volatile sig_atomic_t aborting = 0; </p> <p> void chld_handler (int sig) { if(sig == SIGINT){ </p> [cc lang="c"] aborting++; } } |
int rand_start(int low,int high){
int s;
int r = 0;
函数srand(时间(NULL));
s = rand();
r = s%高+低;
返回r;
}
void Usage(){
printf("用法:schedule [-s] [-f] n");
出口(1);
}
int main(int argc,char * argv []){
/ getopt variablen /
int opt;
int index;
int sflag = 0;
int fflag = 0;
char * svalue;
char * fvalue;
int sseconds = ssec;
int fseconds = fsec;
char * reactor;
char * emergency;
char * logfile;
/ ** /
char * endptr;
/管子和儿童/
int pipepc1 [2];
int pipepc2 [2];
int child1_fd;
int child2_fd;
FILE *日志;
FILE * pipe_reader;
char * p;
char * buf;
int waitFc;
int状态;
/ PRGM /
int prg_r;
int prg_e;
/终止/
int cnt = 0;
int start_period;
p = malloc(fgbuf * sizeof(char));
buf = malloc(fgbuf * sizeof(char));
(无效)信号(SIGINT,chld_handler);
if(argc <4){
1 | Usage(); |
} else if(argc == 4){
1 2 3 | reactor = argv[1]; emergency = argv[2]; logfile = argv[3]; |
} else if(argc> 4){
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | /*argumentenbehandlung*/ while((opt = getopt(argc,argv,":s:f:")) != -1){ printf("sflag %d fflag %d ",sflag,fflag); printf("opt %c ", opt); printf("optind %d ",optind); switch(opt){ case 's': if(sflag == 0){ sflag++; svalue = optarg; }else{ fprintf(stderr,"Widerholung der option -s "); Usage(); } break; case 'f': if(fflag == 0){ fflag++; fvalue = optarg; }else { fprintf(stderr,"Widerholung der option -f "); Usage(); } break; case ':' : fprintf(stderr,"Option -%c brauch ein argument ",optopt); Usage(); break; case '?' : fprintf(stderr,"Nicht bekannte option -%c ",optopt); Usage(); break; default : assert(0); }/*switch*/ }/*while getopt*/ for(index = optind; index < argc; index++){ if((argc - index) == 3){ reactor = argv[index]; }else if((argc - index) == 2){ emergency = argv[index]; }else if((argc - index) == 1){ logfile = argv[index]; } }/*for schleife*/ /* */ if(sflag){ sseconds = (int)strtol(svalue,&endptr,decbase); printf("%d ssec ", sseconds); } if(fflag){ fseconds = (int)strtol(fvalue,&endptr,decbase); printf("%d fsec ", fseconds); } |
}
/ pipeing /
if(pipe(pipepc1)== -1){
} else {printf("Pipe created n");}
/ erzeuge child1 /
child1_fd = fork();
if(child1_fd <0){
}
if(child1_fd == 0){
的printf("CHILD n");
/关闭管读/
if(close(pipepc1 [0])== -1){
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | fprintf(stderr,"Konnte nicht das Read-Ende vom pipepc1 schliessen "); exit(1); } if(close(1) == -1){ fprintf(stderr,"Konnte nicht das Read-Ende vom pipepc1 schliessen "); exit(1); } if(dup(pipepc1[1]) !=STDOUT_FILENO){ fprintf(stderr,"Das setzen des Read-Endes als stdout is Fehlgeschlagen "); exit(1); } if(fseconds == 0){ start_period = sseconds; }else start_period = rand_start(sseconds,(sseconds + fseconds)); for(cnt = 0; cnt < 5; cnt++){ sleep(start_period); fflush(stdout); prg_r = execl(reactor,"",NULL); //printf("prg_r ist %d ", prg_r); } if(close(pipepc1[1]) == -1){ fprintf(stderr,"Das neue stdout konnte nich geschlossen werden "); exit(1); } |
}其他{
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | printf("**PARENT** "); log = fopen(logfile,"w"); /*schliesse pipe read*/ close(pipepc1[1]); pipe_reader = fdopen(pipepc1[0],"r"); while((buf = fgets(p,fgbuf,pipe_reader)) != NULL){ printf("from Child : %s ",buf); fflush(pipe_reader); } fclose(log); waitFc= waitpid(child1_fd,&status,0); if(waitFc == -1){ fprintf(stderr,"Das Warten ist fehlgeschlagen "); exit(1); } printf("child is done und waitFc = %d und satus %d",waitFc,status); fclose(pipe_reader); close(pipepc1[1]); |
}
printf("argc =%d n",argc);
出口(0);
}
代码>
和反应堆计划:
#include
#include
#include
int main(){
srand(time(NULL));
int i;
int s;
/*printf("%d
",s);*/
if(s != 6){
printf("OK
");
fflush(stdout);
}else {
printf("PRESSURE TOO HIGH - IMMEDIATE SHUTDOWN REQUIRED");
exit(EXIT_FAILURE);
PRE>
}
}
代码>
它不会在子进程内循环,因为你正在执行exec,这通常意味着它覆盖子进程并将退出。
如果你想循环,你将不得不从你的循环中产生另一个子进程,你通常只执行exec,因此当它迭代它将产生一个子进程,你在其中执行exec它将覆盖并退出。
所以你需要做的是: -
1 2 3 4 5 6 7 8 | for(cnt = 0; cnt < 5; cnt++){ sleep(start_period); fflush(stdout); child2_fd = fork(); if (child2_fd == 0){ prg_r = execl(reactor,"",NULL); } } |
嗯...你使用fork()调用来创建一个子进程然后execl()来执行另一个程序。问题是execl()用您正在执行的命令的图像替换当前的过程映像(您的子进程)。因此,在for()循环的第一次传递结束时,您的程序将被执行命令替换。当它完成它的工作时,它只是简单地退出,终止子进程。
我认为你需要做的是调用popen()而不是execl()。这将导致命令在单独的进程中执行,而不是替换当前进程。如果需要,您甚至可以立即启动所有命令(在循环中调用popen()),然后使用select()/ epool()在子进程可用时立即读取数据。