Открываем файл,

User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

f_evgeny wrote:Я не говорю плохо это, или хорошо, но, лично для меня из этого следует то, что многие вещи, которые в Юниксе реализуются на скриптах, в Виндовсе работать не будут. Или для того, чтобы они работали надо перезапускать компьютер.

Я честно говоря не понял, что Вы имеете в виду и почему скриптам недоступны те же возможности, которые имеются в API.
Cheers
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Мужики! А почему fcntl, мой любимый не катит за мандатори лок?
Не понимаю... :pain1:
2. Я че VC спрашивал про конкретные действия, самхау у меня
флаг l в ls не получалось получить.
На теже действия, и на FreeBSD, и на Соларис 9 /*на обоих пробовал под рутом*/у меня получалось S instead of l

vc wrote:

Code: Select all

oracle@staging1>chmod 2644 a.dat
oracle@staging1>ls -l a.dat
-rw-r-lr--   1 oracle   dba          504 May  9 12:21 a.dat


VC
Верить нельзя никому - даже себе. Мне - можно!
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

lx_uk wrote:Тенгиз, а почему залоченный файл обязательно должен быть связан с элементом директории? Так что в результате файл можно переименовать но не удалить. Это особенности файловой системы (т.е. нечто "фундаментальное") или конкретной реализации?

На самом деле файл можно и удалить, если он был открыт в соответствующем режиме. Что касается более глобальных вопросов - я не специалист по файловым системам, поэтому могу только спекулировать на эту тему - скажем, беспрепятственное удаление элемента из директории при сохранении потоков данных ассоциированных с элементов вообще-то не очень хорошо. Просто из самых общих соображений. Например, это очевидно потребует наличия специального сборщика мусора.
Cheers
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

A. Fig Lee wrote:Мужики! А почему fcntl, мой любимый не катит за мандатори лок?
Не понимаю... :pain1:
2. Я че VC спрашивал про конкретные действия, самхау у меня
флаг l в ls не получалось получить.
На теже действия, и на FreeBSD, и на Соларис 9 /*на обоих пробовал под рутом*/у меня получалось S instead of l

vc wrote:

Code: Select all

oracle@staging1>chmod 2644 a.dat
oracle@staging1>ls -l a.dat
-rw-r-lr--   1 oracle   dba          504 May  9 12:21 a.dat


VC


Copy&paste:

Code: Select all

oracle@staging1>uname -a
SunOS staging1 5.8 Generic_108528-20 sun4u sparc SUNW,UltraAX-i2
oracle@staging1>ls -l > a.dat
oracle@staging1>ls -l a.dat
-rw-r--r--   1 oracle   dba         1134 May 12 21:53 a.dat
oracle@staging1>chmod 2644 a.dat
oracle@staging1>ls -l a.dat
-rw-r-lr--   1 oracle   dba         1134 May 12 21:53 a.dat
oracle@staging1>


VC
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

A. Fig Lee wrote:Мужики! А почему fcntl, мой любимый не катит за мандатори лок?
Не понимаю... :pain1:
2. Я че VC спрашивал про конкретные действия, самхау у меня
флаг l в ls не получалось получить.
На теже действия, и на FreeBSD, и на Соларис 9 /*на обоих пробовал под рутом*/у меня получалось S instead of l

vc wrote:

Code: Select all

oracle@staging1>chmod 2644 a.dat
oracle@staging1>ls -l a.dat
-rw-r-lr--   1 oracle   dba          504 May  9 12:21 a.dat



VC


In Linux in addition to 'chmod', you need to mount the FS so that mandatory locking were enabled:

<quote>
To enable mandatory locking, you must first mount the filesystem with
the mand mount option:

# mount | grep /data
/dev/hda7 on /data type ext3 (rw,noatime)

# mount -oremount,mand /boot

# mount | grep /data
/dev/hda7 on /data type ext3 (rw,mand,noatime)
</quote>

I don't know about FreeBSD, never used it.

VC
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

vc wrote:Copy&paste:

Code: Select all

oracle@staging1>uname -a
SunOS staging1 5.8 Generic_108528-20 sun4u sparc SUNW,UltraAX-i2
oracle@staging1>ls -l > a.dat
oracle@staging1>ls -l a.dat
-rw-r--r--   1 oracle   dba         1134 May 12 21:53 a.dat
oracle@staging1>chmod 2644 a.dat
oracle@staging1>ls -l a.dat
-rw-r-lr--   1 oracle   dba         1134 May 12 21:53 a.dat
oracle@staging1>

VC

Copy && paste

Code: Select all

bash-2.05$ su root
Password:
# who am i
dmitriy    pts/7        May  8 22:47   
# pwd
/tmp
# touch a.dat
# ls -l a.dat
-rw-r--r--   1 root     other           0 May 12 22:24 a.dat
# chmod 2644 a.dat
# ls -l a.dat
-rw-r-Sr--   1 root     other           0 May 12 22:24 a.dat
# uname -a
SunOS sparc 5.9 Generic sun4u sparc SUNW,Ultra-5_10
#

:pain1:
Верить нельзя никому - даже себе. Мне - можно!
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

tengiz wrote:
f_evgeny wrote:Я не говорю плохо это, или хорошо, но, лично для меня из этого следует то, что многие вещи, которые в Юниксе реализуются на скриптах, в Виндовсе работать не будут. Или для того, чтобы они работали надо перезапускать компьютер.

Я честно говоря не понял, что Вы имеете в виду и почему скриптам недоступны те же возможности, которые имеются в API.

Я имел в виду то, что например, скрипты, которые удаляют файлы, в Виндовсе будут спотыкаться на залоченных файлах. Похожая ситуация не только с удалением файлов, есть еще и другие засады.
Вот опыт опыт и говорит, что скрипт из трех строк, написанный в понедельник с похмелья на коленке, будет годами работать на UNIX. Аналогичная задачка в Виндовс строк занимает как правило больше и спотыкается в самых неожиданных местах.
Ни в коем случае не хочу хаять Виндовс, это относится к специфике ОС, которую надо учитывать при работе с ней.
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

A. Fig Lee wrote:Copy && paste

Code: Select all

bash-2.05$ su root
Password:
# who am i
dmitriy    pts/7        May  8 22:47   
# pwd
/tmp
# touch a.dat
# ls -l a.dat
-rw-r--r--   1 root     other           0 May 12 22:24 a.dat
# chmod 2644 a.dat
# ls -l a.dat
-rw-r-Sr--   1 root     other           0 May 12 22:24 a.dat
# uname -a
SunOS sparc 5.9 Generic sun4u sparc SUNW,Ultra-5_10
#




Apparently in 2.9, Solaris changed the way it displays the permission bits, so instead of 'l', it shows 'S'. However, the octal bit set should be the same (2644).

Does the following piece of code (I posted earlier) produce the 'Resource temporarily unavailable' eror?:

Code: Select all

#include <unistd.h> 
#include <fcntl.h>
#include <errno.h>

int main() {
  int fd;
  fd = open("a.dat", O_RDWR);
  if (errno > 0) {printf("Could not open: %d\n", errno); exit(1);}
  lockf(fd, F_TLOCK, 0);
  if (errno > 0) {printf("Could not lock: %d\n", errno); exit(2);}
  sleep(100);
}

oracle@staging1>gcc -o a a.c
oracle@staging1>ls -l > a.dat
oracle@staging1>chmod 2644 a.dat

oracle@staging1>./a &
[1] 9286
oracle@staging1>cp a a.dat
cp: cannot create a.dat: Resource temporarily unavailable
oracle@staging1>



I do not have access to Soraris 9 and cannot verify if manadatory locking works there.

VC
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

vc wrote:Apparently in 2.9, Solaris changed the way it displays the permission bits, so instead of 'l', it shows 'S'. However, the octal bit set should be the same (2644).

FreeBSD

Code: Select all

su-2.05b# uname -a
FreeBSD host 5.2.1-RELEASE FreeBSD 5.2.1-RELEASE #0: Fri Apr  9 15:56:22 GMT 2004     dmitriy@host:/usr/obj/usr/src/sys/SIMPLE  i386
su-2.05b# ls -l a*
-rwxr-xr-x  1 root  wheel  5084 May 13 19:35 a
-rw-r--r--  1 root  wheel   299 May 13 19:34 a.c
-rw-r-[b]S[/b]r--  1 root  wheel  5084 May 13 19:35 a.dat



Code: Select all

www# uname -a
FreeBSD host2 4.3-RELEASE FreeBSD 4.3-RELEASE #0: Mon Jul  2 12:38:20 EDT 2001     root@web:/usr/obj/usr/src/sys/MYKERNEL  i386
www# ls -l
-rwxr-xr-x  1 root     wheel      4867 May 13 19:34 a
-rw-r--r--  1 root     wheel       299 May 13 19:34 a.c
-rw-r-[b]S[/b]r--  1 root     wheel      4867 May 13 19:36 a.dat

На Солярке ага, производит еррор.
Кстати, на FreeBSD ета система не сработала.
fcntl rules без всяких мандатори локс.
Верить нельзя никому - даже себе. Мне - можно!
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

A. Fig Lee wrote:На Солярке ага, производит еррор.
Кстати, на FreeBSD ета система не сработала.
fcntl rules без всяких мандатори локс.


OK, so you proved that Solaris 9 has mandatory locking and FreeBSD (whatever it is) does not.

FCNTL is just an interface to the OS locking mechanism, nothing more.

VC
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

vc wrote:
A. Fig Lee wrote:На Солярке ага, производит еррор.
Кстати, на FreeBSD ета система не сработала.
fcntl rules без всяких мандатори локс.


OK, so you proved that Solaris 9 has mandatory locking and FreeBSD (whatever it is) does not.

Что значит "мандатори локинг"? fcntl работает.

FCNTL is just an interface to the OS locking mechanism, nothing more.
VC

Хммм... Тот лок что Вы тут описывали и пропагандировали имплементед сверху fcntl.

Code: Select all

man flock

Если fcntl просто интерфейс, то flock и подавно.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

A. Fig Lee wrote:Если fcntl просто интерфейс, то flock и подавно.


http://www.erlenstar.demon.co.uk/unix/faq_3.html

flock() originates with BSD, and is now available in most (but not all) Unices. It is simple and effective on a single host, but doesn't work at all with NFS. It locks an entire file. Perhaps rather deceptively, the popular Perl programming language implements its own flock() where necessary, conveying the illusion of true portability.

fcntl() is the only POSIX-compliant locking mechanism, and is therefore the only truly portable lock. It is also the most powerful, and the hardest to use. For NFS-mounted file systems, fcntl() requests are passed to a daemon (rpc.lockd), which communicates with the lockd on the server host. Unlike flock() it is capable of record-level locking.

Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

Не совсем по теме но интересно...

As a side note, Windows locking does not check properly for file
permissions before attempting to lock a file, only when actually
reading/writing data to the file. This presents a security risk, as a
malignent program could conceivably block access to all files on the
disk by locking them exclusively.
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Strannik223 wrote:
flock() originates with BSD, and is now available in most (but not all)....


??? Ето че?

Code: Select all

# man flock
SunOS/BSD Compatibility Library Functions             flock(3UCB)

NAME
     flock - apply or remove an advisory lock on an open file

SYNOPSIS
     /usr/ucb/cc[ flag ... ] file ...
     #include <sys/file.h>

     int flock( fd,  operation);
     int fd, operation;

DESCRIPTION
     flock() applies or removes an  advisory  lock  on  the  file
     associated  with  the  file descriptor fd. The compatibility
     version of flock() has been implemented on top  of  fcntl(2)
     locking.
.......

...
Верить нельзя никому - даже себе. Мне - можно!
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Strannik223 wrote:
As a side note, Windows locking does not check properly for file permissions before attempting to lock a file, only when actually reading/writing data to the file. This presents a security risk, as a malignent program could conceivably block access to all files on the disk by locking them exclusively.

The side note is wrong. LockFile/LockFileEx specificly require read or write access right on the file handle they operate.
Cheers
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

tengiz wrote:
Strannik223 wrote:
As a side note, Windows locking does not check properly for file permissions before attempting to lock a file, only when actually reading/writing data to the file. This presents a security risk, as a malignent program could conceivably block access to all files on the disk by locking them exclusively.

The side note is wrong. LockFile/LockFileEx specificly require read or write access right on the file handle they operate.


Может это давно было. И неправда. :mrgreen:
Никакой разрухи нет. (с) Проф. Преображенский.
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

A. Fig Lee wrote:
vc wrote:
A. Fig Lee wrote:На Солярке ага, производит еррор.
Кстати, на FreeBSD ета система не сработала.
fcntl rules без всяких мандатори локс.


OK, so you proved that Solaris 9 has mandatory locking and FreeBSD (whatever it is) does not.

Что значит "мандатори локинг"? fcntl работает.


It's unclear what you mean by 'fcntl works'. Sure it works for co-operating processes (as flock/lockf would). But since you want to protect your file from being overwritten by any arbitrary process, fcntl would not 'work' in FreeBSD precisely because the OS does not implement mandatory locking.

A. Fig Lee wrote:Хммм... Тот лок что Вы тут описывали и пропагандировали имплементед сверху fcntl.

Code: Select all

man flock

Если fcntl просто интерфейс, то flock и подавно.


You should read what I wrote more carefully -- I used lockf (which is indeed a simplified interface to fcntl), not flock, but that's beside the point as fcntl would not 'work' for non-cooperating processes under FreeBSD anyway. A 'cp', for example, will happily overwrite a 'locked' file in FreebSD, lock or no lock.

VC

Return to “Вопросы и новости IT”