<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Linux Forum &mdash; С блокировка файла при записи и чтении]]></title>
		<link>https://linuxforum.ru/viewtopic.php?id=32714</link>
		<atom:link href="https://linuxforum.ru/extern.php?action=feed&amp;tid=32714&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «С блокировка файла при записи и чтении».]]></description>
		<lastBuildDate>Wed, 18 Dec 2013 08:52:25 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: С блокировка файла при записи и чтении]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=382809#p382809</link>
			<description><![CDATA[<p>Не совсем понятно что нужно и что не получается. <br />Пример поочередного захвата файлового дескриптора<br /></p><div class="codebox"><pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;stdint.h&gt;
#include &lt;pthread.h&gt;
#include &lt;sys/epoll.h&gt;
#include &lt;sys/file.h&gt;
#include &lt;unistd.h&gt;

int main ()
{
  int s, i;
  struct flock fl;

  if ((s=open (&quot;/tmp/man.txt&quot;, O_RDWR | O_CREAT)) &lt; 0) {
    perror (&quot;not open&quot;);
    return;
  }

  fl.l_whence = 0; /* SEEK_SET, SEEK_CUR, SEEK_END */
  fl.l_start  = 0;        /* Offset from l_whence         */
  fl.l_len    = 0;        /* length, 0 = to EOF           */

  int st = fork ();
  switch (st) {
   case -1:
     perror (&quot;Ошибка нового процесса&quot;);
     break;
   case 0:
     fprintf (stderr, &quot;Дочерний процесс создан \n&quot;);
     fl.l_type = F_RDLCK;
     if (fcntl(s, F_SETLKW, &amp;fl) == 0)
       fprintf (stderr, &quot;дочерний процесс захватил блокировку чтения \n&quot;);
     else
       perror (&quot;блокировка чтения дочерним процессом провалена&quot;);

     sleep (10);
     close (s);
     fprintf (stderr, &quot;завершился дочерний процесс \n&quot;);
     break;
   default:
     fprintf (stderr, &quot;родительский процесс продолжает \n&quot;);
     fl.l_type = F_WRLCK;
     if (fcntl(s, F_SETLKW, &amp;fl) == 0)
       fprintf (stderr, &quot;родительский процесс захватил блокировку записи \n&quot;);
     else
       perror (&quot;блокировка запси родительским процессом провалена&quot;);

     sleep (10);
     close (s);
     fprintf (stderr, &quot;родительский процесс завершился \n&quot;);
     break;
  }
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (marikk)]]></author>
			<pubDate>Wed, 18 Dec 2013 08:52:25 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=382809#p382809</guid>
		</item>
		<item>
			<title><![CDATA[Re: С блокировка файла при записи и чтении]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=382757#p382757</link>
			<description><![CDATA[<p>В случае разных потоков это делается через семафор или mutex,<br />для процессов, запускаемых через fork, не прообовал.</p><p>Пётр.</p>]]></description>
			<author><![CDATA[null@example.com (Peter)]]></author>
			<pubDate>Wed, 18 Dec 2013 05:00:09 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=382757#p382757</guid>
		</item>
		<item>
			<title><![CDATA[С блокировка файла при записи и чтении]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=382751#p382751</link>
			<description><![CDATA[<p>осуществляется работа с одним и тем же файлом. Каждый процесс открывает файл, Один процесс пишет в файл, другой - читает из него.<br />нужно сделать с блокировками, но никак не получается <br /></p><div class="codebox"><pre><code>int main()
{
    int  fd;
    int fd_1;
    int  ret_status;
    char  buffy[128];
    char buffy1[32];

    sprintf(buffy, &quot;Hello World&quot;);

    struct flock fl;
    fl.l_type   = F_WRLCK;  /* F_RDLCK, F_WRLCK, F_UNLCK    */
    fl.l_whence = SEEK_SET; /* SEEK_SET, SEEK_CUR, SEEK_END */
    fl.l_start  = 0;        /* Offset from l_whence         */
    fl.l_len    = 0;        /* length, 0 = to EOF           */
    fl.l_pid    = getpid(); /* our PID                      */

    if (access(&quot;tel_position&quot;, F_OK) == 0) {
       fd = open(&quot;tel_position&quot;,O_RDWR|O_TRUNC);}
    else {
       fd = creat(&quot;tel_position&quot;,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);}
       fd_1 = open(&quot;tel_position&quot;,O_RDONLY); /* get the file descriptor */

     fork();

    ret_status = fcntl(fd, F_SETLKW, &amp;fl);
    write(fd,buffy,strlen(buffy));
//    sleep(5);
    fl.l_type   = F_UNLCK;
    fcntl(fd, F_SETLK, &amp;fl); /* set the region to unlocked */
    close(fd);


    fcntl(fd_1, F_SETLKW, &amp;fl);
    while (read(fd_1, buffy1, 32) &gt; 0){
    fl.l_type   = F_UNLCK;   /* tell it to unlock the region */
    fcntl(fd_1, F_SETLK, &amp;fl); /* set the region to unlocked */
    close(fd_1);

    //sscanf (buffy1,&quot;%s&quot; );
    printf(&quot;telescope position:&quot;, buffy1);}
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (JuliaDulceFlor)]]></author>
			<pubDate>Wed, 18 Dec 2013 04:44:12 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=382751#p382751</guid>
		</item>
	</channel>
</rss>
