Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: dwni2 в Nov 12, 2012, 16:54



Титла: 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

При мен проработи ето така:
Код
GeSHi (C):
  1. int fd=shm_open("../../home/ubuntum/test2",O_RDONLY,0755)

Но нямам никаква идея дали това е правилна имплементация :)
Общо взето си търси разни работи в /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 от камера.