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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2015, 02:35   #1
Renge
Пользователь
 
Аватар для Renge
 
Регистрация: 07.12.2010
Сообщений: 35
По умолчанию Пинг-понг через два канала

Код:
    int pid1, pid2, fd1[2], fd2[2];
    pipe(fd1);
    pipe(fd2);
    if (!fork()){
        close(fd2[0]); close(fd1[1]);
        FILE *f11 = fdopen(fd1[0], "r");
        FILE *f22 = fdopen(fd2[1], "w");
        while(1){
            int cnt = 1;
            if (n++ != 1){
                fscanf(f11, "%d", &cnt);
            }
            printf("1 %d\n", cnt);
            if (cnt < max){
                cnt++;
                fprintf(f22, "%d", cnt);
            }

            if (cnt >= max) {
                fclose(f11); fclose(f22); close(fd1[0]); close(fd2[1]);
                exit(0);
            }

        }
    }
    if (!fork()){
        close(fd1[0]); close(fd2[1]);
        FILE *f21 = fdopen(fd2[0], "r");
        FILE *f12 = fdopen(fd1[1], "w");
        while (1){
            int cnt = 1;
            fscanf(f21, "%d", &cnt);
            printf("2 %d\n", cnt);
            if (cnt < max){
                cnt++;
                fprintf(f12, "%d", cnt);
            }
            if (cnt >= max) {
                fclose(f21); fclose(f12); close(fd2[0]); close(fd1[1]);
                exit(0);
            }
        }
    }
    wait(0);
Пинг-понг до cnt = max (тут max = 100) через два неименованных канала между двумя процессами-сынами с выводом этого всего на экран. Можно пользоваться только высокоуровневым вводом-выводом. В общем с ним вроде и проблема, все будет корректно работать, если вместо него пользоваться read-write.
А так выводит 1 1 и зависает, что не так?

Последний раз редактировалось BDA; 09.11.2015 в 04:05. Причина: Используйте кнопочку # для обрамления кода
Renge вне форума Ответить с цитированием
Старый 09.11.2015, 04:01   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

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

int
main(int argc, char *argv[])
{
    int fd1[2];
    int fd2[2];
    pipe(fd1);
    pipe(fd2);
    int max = strtol(argv[1], NULL, 10);
    FILE *f[2][2];
    f[0][0] = fdopen(fd2[0], "r");
    f[0][1] = fdopen(fd1[0], "r");
    f[1][0] = fdopen(fd1[1], "w");
    f[1][1] = fdopen(fd2[1], "w");
    fprintf(f[1][1], "1\n");
    fflush(f[1][1]);
    for (int i = 0; i < 2; ++i) {
        if (!fork()) {
            fclose(f[0][(i + 1) % 2]);
            fclose(f[1][(i + 1) % 2]);
            int num;
            while (fscanf(f[0][i], "%d", &num) == 1 && num != max) {
                printf("%d %d\n", i + 1, num);
                fflush(stdout);
                fprintf(f[1][i], "%d\n", num + 1);
                fflush(f[1][i]);
            }
            fclose(f[0][i]);
            fclose(f[1][i]);
            _exit(0);
        }
    }
    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 2; ++j) {
            fclose(f[i][j]);
        }
    }
    wait(NULL);
    wait(NULL);
    printf("Done\n");
    return 0;
}
Откопал свой код со 2 курса. Уже не помню, из-за чего задачка не проходила тесты сначала, предположу, что из-за отсутствия fflush. Вы случайно не на ВМК учитесь?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 09.11.2015, 16:18   #3
Renge
Пользователь
 
Аватар для Renge
 
Регистрация: 07.12.2010
Сообщений: 35
По умолчанию

О, я вроде и раньше с fflush пыталась, но теперь по какой-то магии все заработало. Да, на ВМК учусь. Спасибо)
Renge вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пинг-понг mixon-21 JavaScript, Ajax 1 19.01.2014 12:57
Пинг понг (паскаль) Katmai Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 29.10.2010 22:59
Пинг-понг Ckomoroh Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 27.08.2010 18:33