<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; Процессы с таймаутом]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=7177&amp;type=atom" />
	<updated>2010-10-07T03:23:45Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=7177</id>
		<entry>
			<title type="html"><![CDATA[Re: Процессы с таймаутом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=98608#p98608" />
			<content type="html"><![CDATA[<p>Скорее проблема из-за записи в переменную. Каким образом можно записть вывод вызываемой программы в переменную, без dup2. Либо с ним, но другим способом?</p>]]></content>
			<author>
				<name><![CDATA[rsang]]></name>
				<uri>https://linuxforum.ru/profile.php?id=11659</uri>
			</author>
			<updated>2010-10-07T03:23:45Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=98608#p98608</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Процессы с таймаутом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=98512#p98512" />
			<content type="html"><![CDATA[<p>Я разбираться не стал, но вообще можно попробовать через создание потока,<br />man create_pthread.<br />Это немного сложнее с установкой переменной, но проще с реализацией<br />в целом.</p><p>Пётр.</p>]]></content>
			<author>
				<name><![CDATA[Peter]]></name>
				<uri>https://linuxforum.ru/profile.php?id=5246</uri>
			</author>
			<updated>2010-10-06T16:50:04Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=98512#p98512</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Процессы с таймаутом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=98339#p98339" />
			<content type="html"><![CDATA[<p>Преветствую. Не силён в языке, но пытаюсь написать программу, выполняющую следующее:<br />бесконечно запускать какую-либо программу, записывать вывод запущенной программы в переменную для последующей обработки. Если запускаемая программа выполняется дольше нужного времени - завершать её и где-либо делать отметку, что программа завершилась не сама. Пока смог сделать только вот это:<br /></p><div class="codebox"><pre><code>#include &lt;sys/types.h&gt;
#include &lt;sys/wait.h&gt;
#include &lt;signal.h&gt;
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;errno.h&gt;
 
#define LOG_FILE &quot;/programma.log&quot;
#define STDOUT 1
enum {READ, WRITE};
 
 
void log_message(char *filename, char *message)
{
    FILE *logfile;
    logfile = fopen(filename, &quot;a&quot;);
    if(!logfile) return;
    fwrite(message, 1, strlen(message), logfile);
    fclose(logfile);
}
 
 
void sig_alarm(int signo)
{
  signal(SIGALRM, sig_alarm);
  printf(&quot;Timeout PID - %d...\n&quot;, (int) getpid());
  log_message(LOG_FILE, &quot;Timeout PID\n&quot;);
  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) &lt; 0) {
        perror(&quot;Pipe creation error\n&quot;);
        return -1;
    }
     
    int p = fork ();
    if (p == -1) {
        perror (&quot;Fork error\n&quot;);
        exit (1);
    }
     
    if (p == 0) {
        printf(&quot;Pid child: %d\n&quot;,(int) getpid());
        signal(SIGALRM, sig_alarm);
        
        alarm(5);
        dup2(fd[WRITE], STDOUT);
        close(fd[WRITE]);
        close(fd[READ]);
        
        system(&quot;/program1&quot;);
        printf(&quot;\033[01;33m   NormalEndPID-%d\n \033[m&quot;, (int) getpid());
        alarm(0);
 
        exit (EXIT_SUCCESS);
    }
        close(fd[WRITE]);
        f=fdopen(fd[READ], &quot;r&quot;);
        
        i=0;
        
        while (!feof (f)) {
            //s1=(char *)malloc(300);
            if(fscanf (f, &quot;%s&quot;, s1)==1){
                if(i==0){
                    strcpy(buffer, s1);
                    strcat(buffer, &quot;\n&quot;);
                }else{
                    strcat(buffer, s1);
                    strcat(buffer, &quot;\n&quot;);
                }
                //printf(&quot; Buffer: %s, len: %d\n&quot;, buffer, strlen(buffer));
                i++;
            }
        }
        
        fclose(f);
        printf(&quot;\n\nChild said:\n---------\n%s---------\n&quot;, buffer);
}
 
int main (int argc, char *argv[])
{
    signal(SIGCHLD, SIG_IGN);
    
    do {
    printf (&quot;\n\nStart new process.\n&quot;);
        fork_child();
        sleep(1);
    } while (1);
 
    return 0;
}</code></pre></div><p>Ситуация такая: если вызываемая программа не зависает, но всё проходит нормально. Данные записываются в переменную и выводятся на экран.<br />Но, если вызываемая программа выполняется долго, то на экран вообще ничего не выводится - процесс так и висит вместе с ней. Если же убрать запись в переменную, то при зависании вызываемой программы она отлично убивается через 5 секунд.<br />Собственно в этом и проблема. И ещё, как определить, что процесс убит, а не завершённ самостоятельно. Сейчас идёт только вывод, что он убит.<br />И ещё, заметил, что со временем в системе со временем уменьшается память. Похоже, что где-то утечка, но не пойму где.</p>]]></content>
			<author>
				<name><![CDATA[rsang]]></name>
				<uri>https://linuxforum.ru/profile.php?id=11659</uri>
			</author>
			<updated>2010-10-06T07:06:18Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=98339#p98339</id>
		</entry>
</feed>
