关于C#:子进程中的程序运行不循环

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){

1
2
3
fprintf(stderr,"Fehler bei der Erzeugung der pipe
"
);
exit(1);

} else {printf("Pipe created n");}

/ erzeuge child1 /
child1_fd = fork();

if(child1_fd <0){

1
2
3
fprintf(stderr,"Fehler beim asfuehren von fork
"
);
exit(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;

s = rand() % 7;
/*printf("%d
",s);*/

if(s != 6){

printf("OK
");
fflush(stdout);

}else {

printf("PRESSURE TOO HIGH - IMMEDIATE SHUTDOWN REQUIRED");
exit(EXIT_FAILURE);

}

}


它不会在子进程内循环,因为你正在执行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()在子进程可用时立即读取数据。