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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2013, 15:58   #1
sunny_alice
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 46
Печаль Межпроцессное взаимодействие (чистый Си)

Здравствуйте.
Пытаюсь на чистом СИ записать информацию в канал и считать оттуда в двух разных процессах. Почему-то записывает данные, а считать не может. Помогите разобраться, пожалуйста.

Код:
int main(void) {
    int     fd, result, kol = 10;
    size_t  size;
    char    name[] = "myfifo2.fifo";
    int     fileSize = 25;
    char    *string [fileSize];
    char    *res[fileSize]; 

    /* Обнуляем маску создания файлов текущего процесса для того, чтобы права доступа у создаваемого FIFO точно соответствовали параметру вызова mknod() */

    (void)umask(0); 

    //Если не можем создать FIFO
    if(mknod(name, S_IFIFO | 0666, 0) < 0) {
        printf("Can\'t create FIFO\n";);
        exit(-1); 
    }

    /* Порождаем новый процесс */ 
    if((result = fork()) < 0) {
    /* Если создать процесс не удалось, сообщаем об этом и завершаем работу */ 
        printf("Can\'t fork child\n";);
        exit(-1);
    } else if (result > 0) {

    /* Мы находимся в родительском процессе, который будет передавать информацию процессу-ребенку. В этом процессе открываем FIFO на запись.*/
	if((fd = open(name, O_WRONLY)) < 0) {
          printf("Can\'t open FIFO for writing\n";);
          exit(-1); 
    	} 

    	// Запись
    	kol = readFile(string);
    	size = write(fd, string, sizeof(string));

	int p;
	for (p = 0; p < 10; p++) { printf("%s\n", string[p]); }

    	/* Если записалось меньшее количество байт,то сообщаем об ошибке и завершаем работу */
    	if(size != sizeof(string)) {
            printf("Can\'t write all string to FIFO\n";);         
            exit(-1); 
	}

        printf("Родитель завершил работу.\n";);

        sleep(10);
        close(fd);
    } else {

        if((fd = open(name, O_RDONLY)) < 0) {
            printf("Can\'t open FIFO for reading\n";);
            exit(-1); 
        }

	// Чтение
	size = read(fd, res, sizeof(res));

	int p;
	for (p = 0; p < 10; p++) { printf("%s\n", res[p]); }

        if(size < 0) {
            printf("Can\'t read string\n";); 
            exit(-1);
        }

	printWords(res, kol);

        close(fd);
    }

    return 0; 
}
После записи и чтения сделала распечатку этих данных. Выводит так (сначала то, что записывается, правильное, а потом то, что считалось, т.е. ничего):

Код:
aiiu
aiiu
oiiu
aiiu
aiaiaiai
aaii
aoii
aiyy
aaii
sdad
Родитель завершил работу.

Последний раз редактировалось sunny_alice; 10.01.2013 в 18:17.
sunny_alice вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсия(чистый си) Daud94 Помощь студентам 0 04.01.2013 13:41
Чистый код kacomp PHP 5 13.10.2012 10:37
Чистый ассемблер 777user777 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 03.02.2011 06:29
Межпроцессное взаимодействие. Каналы. Zefick Win Api 3 02.03.2009 20:48
Межпроцессное взаимодействие ilham Win Api 5 16.12.2008 13:01