Титла: open() проблем Публикувано от: dwni2 в Nov 12, 2012, 16:54 здравейте имам проблем с споделеното отваряне на файл
в една програма на C ето го кода #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <sys/stat.h> int main(int argc,char *argv[]){ char buffer[500]; int fd=open(argv[1],O_SHARE_RDONLY), fd2=open(argv[2],O_CREAT| O_RDWR); if(fd==-1) perror("fd1open"); if(fd2==-1) perror("fd2open"); int len; while((len = read(fd, buffer, sizeof(buffer))) > 0){ if(len==-1) perror("read"); write(fd2,buffer,len); if(len==-1) perror("write"); } return 0; компилирам и като изпалня ми връща error: 'O_SHARE_RDONLY' undeclared (first use in this function) явно този макрос не е деклариран от посикс има ли някаква linux алтернатива за open да се отвори файла за споделено четене на O_SHARE_RDONLY Титла: Re: open() проблем Публикувано от: chen_dzen в Nov 12, 2012, 18:28 Хм ,не виждам да има деклариран аргумент O_SHARE_RDONLY в <fcntl.h> .
пробвай с http://www.kernel.org/doc/man-pages/online/pages/man3/shm_open.3.html поздави [_]3 Титла: Re: open() проблем Публикувано от: dwni2 в Nov 12, 2012, 19:32 опитвам по този начин
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <sys/mman.h> int main(int argc,char *argv[]){ char buffer[500]; int fd=shm_open(argv[1],O_RDONLY,0755), fd2=open(argv[2],O_CREAT| O_RDWR); if(fd==-1) perror("fd1open"); if(fd2==-1) perror("fd2open"); int len; while((len = read(fd, buffer, sizeof(buffer))) > 0){ if(len==-1) perror("read"); write(fd2,buffer,len); if(len==-1) perror("write"); } return 0;} но като изпълня програмата errno ми дава fd1open: No such file or directory дали има някоя алтернатива на опен която да върши тази работа Титла: Re: open() проблем Публикувано от: kifavi8024 в Nov 13, 2012, 04:30 http://stackoverflow.com/questions/11102599/how-do-i-change-the-shm-open-path
При мен проработи ето така: Код
Но нямам никаква идея дали това е правилна имплементация :) Общо взето си търси разни работи в /run/shm по подразбиране (това е при Ubuntu). Титла: Re: open() проблем Публикувано от: dwni2 в Nov 13, 2012, 07:36 и при мен тръгна по този начин но също като при open() когато се опитам да отворя дадено устройство когато е използвано
например /dev/video0 не става иначе когато устройството не се използва работи мисълта ми е има ли някаква линукс алтернатива на тези макроси O_SHARE_RDONLY, O_SHARE_WRONLY, O_SHARE_RDWR Титла: Re: open() проблем Публикувано от: gat3way в Nov 13, 2012, 11:40 Не и не зависи от това. Device node-овете не са обикновени файлове. Това дали един или повече процеси могат да го отварят е въпрос на имплементация на драйвера в ядрото. Примерно може да го позволява (/dev/zero), а може и да не го позволява (/dev/ttyS*).
Титла: Re: open() проблем Публикувано от: kifavi8024 в Nov 13, 2012, 15:11 Също така е хубаво да се ползва unlink-ването.
Вчера гледах пример с грешка при достъп до ttys*. Проблема се решава като предварително се затвори или unlink-не дадения ресурс :) Голем боламач раЗ^иРиШ Ли. Титла: Re: open() проблем Публикувано от: dwni2 в Nov 13, 2012, 15:25 може ли пример как да използвам тези /device
Титла: Re: open() проблем Публикувано от: dwni2 в Nov 14, 2012, 09:09 мойете ли да ми пратите този линк за проблема за достъп през tty
и може ли по някакъв начин да се разреши многократно едновременно отваряне на device node Титла: Re: open() проблем Публикувано от: kifavi8024 в Nov 14, 2012, 18:45 Относно първото питане - видях няколко примера свързани с Permission denied shm_open() error (просто потърси в интернет).
Ето ти една примерна имплементация (с unlink-ване): Modbus Slave Protocol Library ($2) За второ питане ще трябва да провериш документацията и/или да потърсиш в Google. Титла: Re: open() проблем Публикувано от: dwni2 в Nov 15, 2012, 08:34 оки мерси ще го погледна :)
Титла: Re: open() проблем Публикувано от: tsurko в Nov 15, 2012, 17:22 open работи с файлове, shm_open - със shared memory (IPC Инструмент). Съдейки по кода... по-скоро става дума за файлове.
Пробвай така: int fd=open(argv[1],O_RDONLY); fd2=open(argv[2],O_RDWR); Също така те съветвам да си форматираш кода по-добре. Така ще е по-лесен за четене както от теб, така и от другите :) Титла: Re: open() проблем Публикувано от: borovaka в Nov 16, 2012, 10:20 Нали ти писах в друг форум. За това което искаш да направиш потърси Video4Linux Loopback. Даже имаше някакво приложение което го ползваше за да слага ефекти в реално време на stream от камера.
|