Преветствую. Не силён в языке, но пытаюсь написать программу, выполняющую следующее:
бесконечно запускать какую-либо программу, записывать вывод запущенной программы в переменную для последующей обработки. Если запускаемая программа выполняется дольше нужного времени - завершать её и где-либо делать отметку, что программа завершилась не сама. Пока смог сделать только вот это:
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#define LOG_FILE "/programma.log"
#define STDOUT 1
enum {READ, WRITE};
void log_message(char *filename, char *message)
{
FILE *logfile;
logfile = fopen(filename, "a");
if(!logfile) return;
fwrite(message, 1, strlen(message), logfile);
fclose(logfile);
}
void sig_alarm(int signo)
{
signal(SIGALRM, sig_alarm);
printf("Timeout PID - %d...\n", (int) getpid());
log_message(LOG_FILE, "Timeout PID\n");
kill(getpid(), 9);
alarm(1);
}
static pid_t fork_child (void)
{
int fd[2];
FILE *f;
char *buffer[500];
char *s1[100];
int i;
if(pipe(fd) < 0) {
perror("Pipe creation error\n");
return -1;
}
int p = fork ();
if (p == -1) {
perror ("Fork error\n");
exit (1);
}
if (p == 0) {
printf("Pid child: %d\n",(int) getpid());
signal(SIGALRM, sig_alarm);
alarm(5);
dup2(fd[WRITE], STDOUT);
close(fd[WRITE]);
close(fd[READ]);
system("/program1");
printf("\033[01;33m NormalEndPID-%d\n \033[m", (int) getpid());
alarm(0);
exit (EXIT_SUCCESS);
}
close(fd[WRITE]);
f=fdopen(fd[READ], "r");
i=0;
while (!feof (f)) {
//s1=(char *)malloc(300);
if(fscanf (f, "%s", s1)==1){
if(i==0){
strcpy(buffer, s1);
strcat(buffer, "\n");
}else{
strcat(buffer, s1);
strcat(buffer, "\n");
}
//printf(" Buffer: %s, len: %d\n", buffer, strlen(buffer));
i++;
}
}
fclose(f);
printf("\n\nChild said:\n---------\n%s---------\n", buffer);
}
int main (int argc, char *argv[])
{
signal(SIGCHLD, SIG_IGN);
do {
printf ("\n\nStart new process.\n");
fork_child();
sleep(1);
} while (1);
return 0;
}Ситуация такая: если вызываемая программа не зависает, но всё проходит нормально. Данные записываются в переменную и выводятся на экран.
Но, если вызываемая программа выполняется долго, то на экран вообще ничего не выводится - процесс так и висит вместе с ней. Если же убрать запись в переменную, то при зависании вызываемой программы она отлично убивается через 5 секунд.
Собственно в этом и проблема. И ещё, как определить, что процесс убит, а не завершённ самостоятельно. Сейчас идёт только вывод, что он убит.
И ещё, заметил, что со временем в системе со временем уменьшается память. Похоже, что где-то утечка, но не пойму где.
