|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.03.2014, 20:00 | #1 |
Новичок
Джуниор
Регистрация: 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; } так вот программа не блокируется в чем тут дело ?? если оставить в программе только семафор и операции над ним, все отлично работает. подскажите что не так? |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Семафоры для межпрограммного взаимодействия | 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 |