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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2014, 20:00   #1
Hunter_nub
Новичок
Джуниор
 
Регистрация: 14.03.2014
Сообщений: 1
По умолчанию семафоры и пайп

#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//тут создается пайп
int fd[2], result;
size_t size;
char resstring[14];
if(pipe(fd) < 0){
printf("Can\'t create pipe\n");
exit(-1);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//тут семафор
int semid; //
char pathname[] = "1111.cpp";
key_t key; /* IPC ключ */
struct sembuf mybuf;
if((key = ftok(pathname,0)) < 0){printf("Can\'t generate key\n");
exit(-1);
}
if((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0){
printf("Can\'t get semid\n");
exit(-1);
}

// семафор= 1

mybuf.sem_op = 1;
mybuf.sem_flg = 0;
mybuf.sem_num = 0;
if(semop(semid, &mybuf, 1) < 0){
printf("Can\'t wait for condition\n");
exit(-1);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//передаем в пайп строку
close(fd[0]);
size = write(fd[1], "Hello, world!", 14);
if(size != 14){
printf("Can\'t write all string\n");
exit(-1);
}
close(fd[1]);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// блокируем процесс пока семафор не будет равно 0
mybuf.sem_op = 0;
mybuf.sem_flg = 0;
mybuf.sem_num = 0;
if(semop(semid, &mybuf, 1) < 0){
printf("Can\'t wait for condition\n");
exit(-1);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// после разблакировки читаем и выводим эту строку
close(fd[1]);
size = read(fd[0], resstring, 14);
if(size < 0){
printf("Can\'t read string\n");
exit(-1);
}
printf("%s\n",resstring);
close(fd[0]);

return 0;
}
так вот программа не блокируется в чем тут дело ??
если оставить в программе только семафор и операции над ним, все отлично работает.
подскажите что не так?
Hunter_nub вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Семафоры для межпрограммного взаимодействия Voronar Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 0 06.06.2013 20:34
Семафоры - как с ними работать? Mixim Общие вопросы .NET 2 22.10.2012 15:49
Вывол таблицы умножения. Семафоры [Delphi] StudeHt Помощь студентам 0 27.12.2011 20:15
Семафоры, философы. kir_rik Помощь студентам 0 12.04.2010 14:17
семафоры на С Raptor Помощь студентам 1 26.04.2008 18:30