Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2016, 12:49   #1
RaccoonRocket
Пользователь
 
Регистрация: 03.06.2015
Сообщений: 10
Восклицание Программа не выходит после выполнения (Язык С)

программа выводит определённые строки текстового файла на экран, сортируя их.
всё работает отлично, но программа не завершает выполнение, пока пользователь не нажмёт Enter, а почему-то ожидает ввода.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
 
int main(void)
{
int fd[2], fd2[2], pid, pid2;
int file = open("text.txt", O_RDONLY);
pipe( fd );
pipe( fd2 );
dup2( file, fileno(stdin) );
close( file );
printf("\n");
 
if ((pid = fork()) == 0)
{
dup2( fd2[0], fileno( stdin ) );
close( fd2[0] );
close( fd2[1] );
execl( "/usr/bin/tail", "tail", NULL );
}
else
if ((pid2 = fork()) == 0)
{
dup2( fd[0], fileno( stdin) );
dup2( fd2[1], fileno( stdout ) );
close( fd[0] );
close( fd[1] );
close( fd2[0] );
close( fd2[1] );
execl( "/usr/bin/head", "head", "-215", NULL );
}
else
if (pid > 0 & pid2 > 0)
{
dup2( fd[1], fileno( stdout ) );
close( fd[0] );
close( fd[1] );
execl( "/usr/bin/sort", "sort", "-u", NULL );
}
else {
exit(0);
}
return(0);
}
подскажите пожалуйста, в чём ошибка. Нужно, чтобы программа выводила строки и выходила.
программируем в putty.
спасибо)

Последний раз редактировалось Вадим Мошев; 08.02.2016 в 12:56.
RaccoonRocket вне форума Ответить с цитированием
Старый 08.02.2016, 13:28   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А разве не надо ждать завершения запускаемых процессов?
типа такого:
Код:
pid = fork();
if (pid == 0)
{
    ...
}
else if (pid > 0)
{
    wait(0);
}
else
{
    perror("fork failed");
}
Цитата:
программируем в putty.
putty это всего лишь SSH клиент (для доступа к другому компу/серверу). Примерно как TeamViewer и т.д., только без отображения и управления мышкой, а через ввод команд в консоли.

И форматируйте код нормально. Например хотя бы так
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>

int main(void)
{
    int fd[2], fd2[2], pid, pid2;
    int file = open("text.txt", O_RDONLY);
    pipe( fd );
    pipe( fd2 );
    dup2( file, fileno(stdin) );
    close( file );
    printf("\n");
    
    if ((pid = fork()) == 0)
    {
        dup2( fd2[0], fileno( stdin ) );
        close( fd2[0] );
        close( fd2[1] );
        execl( "/usr/bin/tail", "tail", NULL );
    }
    else if ((pid2 = fork()) == 0)
    {
        dup2( fd[0], fileno( stdin) );
        dup2( fd2[1], fileno( stdout ) );
        close( fd[0] );
        close( fd[1] );
        close( fd2[0] );
        close( fd2[1] );
        execl( "/usr/bin/head", "head", "-215", NULL );
    }
    else if (pid > 0 & pid2 > 0)
    {
        dup2( fd[1], fileno( stdout ) );
        close( fd[0] );
        close( fd[1] );
        execl( "/usr/bin/sort", "sort", "-u", NULL );
    }
    else
    {
        exit(0);
    }
    return(0);
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 08.02.2016 в 13:30.
Alex11223 вне форума Ответить с цитированием
Старый 08.02.2016, 14:13   #3
RaccoonRocket
Пользователь
 
Регистрация: 03.06.2015
Сообщений: 10
Злость

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А разве не надо ждать завершения запускаемых процессов?
wait не срабатывает.
хотя, может это я накосячила.

Код:
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>

int main(void)
{
int fd[2], fd2[2], status;
pid_t pid, pid2;
int file = open("text.txt", O_RDONLY);
pipe( fd );
pipe( fd2 );
dup2( file, fileno(stdin) );
close( file );

if ((pid = fork()) == 0)
{
dup2( fd2[0], fileno( stdin ) );
close( fd2[0] );
close( fd2[1] );
execl( "/usr/bin/tail", "tail",0); wait(0); }
       else
       if ((pid2 = fork()) == 0)
       {
       dup2( fd[0], fileno( stdin) );
       dup2( fd2[1], fileno( stdout ) );
       close( fd[0] );
       close( fd[1] );
       close( fd2[0] );
       close( fd2[1] );
       execl( "/usr/bin/head", "head", "-215",0 ); wait(0); }
              else
              if ((pid > 0) && (pid2 > 0))
              {
              dup2( fd[1], fileno( stdout ) );
              close( fd[0] );
              close( fd[1] );
              execl( "/usr/bin/sort", "sort", "-u",0 );
              wait(0);
       } 
       else {
       exit(0);}
return (0);
}
мне кажется, проблема с stdin/stdout

но я уже все варианты перепробовала.
либо не выводит ничего и выходит из программы,
либо выводит как надо и не выходит

почему программа ожидает ввода?
символы набираются в консоли.
Жмёшь Enter - всё выходит.

Последний раз редактировалось RaccoonRocket; 08.02.2016 в 14:34.
RaccoonRocket вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual C++ Ошибка после выполнения. qsv1991 Visual C++ 0 16.01.2013 22:53
Затемнение экрана после выполнения программы wandererindreams Общие вопросы C/C++ 3 20.07.2011 09:14
После выполнения запроса появляется ошибка Lokos БД в Delphi 3 23.06.2011 08:33
Окно после выполнения запроса mortal2010 Microsoft Office Access 6 25.02.2011 13:18
Button после выполнения ProgressBar }{oт@бь)ч Общие вопросы Delphi 7 25.01.2009 12:33