在子进程中运行的程序不会循环
我有一个关于父进程从孩子读取stdout的具体问题。 我的问题是,当我运行程序时,子程序应该在循环中多次执行一个新程序,但它只运行一次并退出到父进程。 子进程正在运行一个简单的程序,它向stdout输出一条消息。 提前致谢。
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <assert.h>
#include <time.h>
#include <sys/wait.h>
#define ssec 1
#define fsec 0
#define secBuf 5
#define decbase 10
#define fgbuf 60
volatile sig_atomic_t aborting = 0;
void chld_handler (int sig)
{
if(sig == SIGINT){
aborting++;
}
}
int rand_start(int low,int high){int s; int r = 0; 函数srand(时间(NULL));
s = rand();
r = s%高+低;
返回r;
}
void用法(){
printf(“Usage: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 *紧急情况; char *日志文件;
/ ** / char * endptr; /管子和孩子/
int pipepc1 [2]; int pipepc2 [2];
int child1_fd; int child2_fd;
FILE * log; FILE * pipe_reader;
char * p;
char * buf; int waitFc; int状态; / prgm / int prg_r; int prg_e;
/ termination / int cnt = 0; int start_period; p = malloc(fgbuf * sizeof(char)); buf = malloc(fgbuf * sizeof(char));
(无效)信号(SIGINT,chld_handler);
if(argc <4){
Usage();
} else if(argc == 4){
reactor = argv[1];
emergency = argv[2];
logfile = argv[3];
} else if(argc> 4){
/*argumentenbehandlung*/
while((opt = getopt(argc,argv,":s:f:")) != -1){
printf("sflag %d fflag %d n",sflag,fflag);
printf("opt %c n", opt);
printf("optind %d n ",optind);
switch(opt){
case 's':
if(sflag == 0){
sflag++;
svalue = optarg;
}else{
fprintf(stderr,"Widerholung der option -sn");
Usage();
}
break;
case 'f':
if(fflag == 0){
fflag++;
fvalue = optarg;
}else {
fprintf(stderr,"Widerholung der option -fn");
Usage();
}
break;
case ':' :
fprintf(stderr,"Option -%c brauch ein argumentn",optopt);
Usage();
break;
case '?' :
fprintf(stderr,"Nicht bekannte option -%c n",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 ssecn", sseconds);
}
if(fflag){
fseconds = (int)strtol(fvalue,&endptr,decbase);
printf("%d fsecn", fseconds);
}
}
/ pipeing /
if(pipe(pipepc1)== -1){
fprintf(stderr,"Fehler bei der Erzeugung der pipen");
exit(1);
} else {printf(“建立的管道 n”);}
/ erzeuge child1 / child1_fd = fork();
if(child1_fd <0){
fprintf(stderr,"Fehler beim asfuehren von forkn");
exit(0);
}
if(child1_fd == 0){printf(“ CHILD n”); / close pipe read / if(close(pipepc1 [0])== -1){
fprintf(stderr,"Konnte nicht das Read-Ende vom pipepc1 schliessenn");
exit(1);
}
if(close(1) == -1){
fprintf(stderr,"Konnte nicht das Read-Ende vom pipepc1 schliessenn");
exit(1);
}
if(dup(pipepc1[1]) !=STDOUT_FILENO){
fprintf(stderr,"Das setzen des Read-Endes als stdout is Fehlgeschlagenn");
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 n", prg_r);
}
if(close(pipepc1[1]) == -1){
fprintf(stderr,"Das neue stdout konnte nich geschlossen werdenn");
exit(1);
}
}其他{
printf("**PARENT**n");
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 n",buf);
fflush(pipe_reader);
}
fclose(log);
waitFc= waitpid(child1_fd,&status,0);
if(waitFc == -1){
fprintf(stderr,"Das Warten ist fehlgeschlagenn");
exit(1);
}
printf("child is donen und waitFc = %dn und satus %d",waitFc,status);
fclose(pipe_reader);
close(pipepc1[1]);
}
printf(“argc =%d n”,argc); 出口(0);
}
和反应堆计划:
#include <stdio.h> #include <stdlib.h> #include <time.h>
int main(){
函数srand(时间(NULL)); int i; int s;
s = rand() % 7; /*printf("%d n",s);*/ if(s != 6){ printf("OKn"); fflush(stdout); }else { printf("PRESSURE TOO HIGH - IMMEDIATE SHUTDOWN REQUIRED"); exit(EXIT_FAILURE);
}
}
那么...你使用fork()调用来创建一个子进程然后execl()来执行另一个程序。 问题是execl()用正在执行的命令的图像替换当前的进程映像(您的子进程)。 所以在for()循环的第一遍结束时,程序被执行命令取代。 当它完成它的工作时,它只是简单地退出,终止子进程。
我认为你需要做的是调用popen()而不是execl()。 这将导致命令在单独的进程中执行,而不是替换当前的进程。 如果你愿意,你甚至可以立即启动所有的命令(在一个循环中调用popen()),然后使用select()/ epool()从子进程读取数据,只要它可用。
它不会在子进程内循环,因为你正在执行exec,这通常意味着它覆盖子进程并将退出。 如果你想循环,你将不得不从循环中产生另一个子进程,在这个循环中你通常只执行exec,所以当它迭代时它会产生一个子进程,在这个子进程中你执行exec,它会覆盖并退出。 所以你需要做的是以下几点: -
for(cnt = 0; cnt < 5; cnt++){
sleep(start_period);
fflush(stdout);
child2_fd = fork();
if (child2_fd == 0){
prg_r = execl(reactor,"",NULL);
}
}
链接地址: http://www.djcxy.com/p/72143.html