1

Преветствую. Не силён в языке, но пытаюсь написать программу, выполняющую следующее:
бесконечно запускать какую-либо программу, записывать вывод запущенной программы в переменную для последующей обработки. Если запускаемая программа выполняется дольше нужного времени - завершать её и где-либо делать отметку, что программа завершилась не сама. Пока смог сделать только вот это:

#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 секунд.
Собственно в этом и проблема. И ещё, как определить, что процесс убит, а не завершённ самостоятельно. Сейчас идёт только вывод, что он убит.
И ещё, заметил, что со временем в системе со временем уменьшается память. Похоже, что где-то утечка, но не пойму где.

2

Я разбираться не стал, но вообще можно попробовать через создание потока,
man create_pthread.
Это немного сложнее с установкой переменной, но проще с реализацией
в целом.

Пётр.

Пётр.

3

Скорее проблема из-за записи в переменную. Каким образом можно записть вывод вызываемой программы в переменную, без dup2. Либо с ним, но другим способом?