07-07-2006
I checked the fcntl locking with two programs, as Jim mentioned in his reply the mandatory locking didn't worked for me in HP-UX.
I have cut pasted both programs for reference.
The scenario I followed to test the locking.
1. first I ran ./locktest executable in background
2. I ran ./locktest1 executable, This program will check the lock and after seeing it locked it tries to write into that file. According to my understanding as the file is locked by "locktest" process
It should not allow "locktest1" process to write into it, but in this case the "locktest1" process is able to write into that file.
Please let me know if I'm missing anything.
Jim:
>> What problem are you trying to solve?
I'm trying to lock file using fcntl or lockf function on HP-UX, In my case I have 2 programs which are trying to update single file. In order to synchronize this I thought locking is better option.
Now also I can do it, I can modify my program to work based on the return value of fcntl() function.
I was just curious and wanted to know why the mandatory locking is not working in HP-UX. Is there any other way so that I can lock (mandatory) file in HP-UX? I,e using IPC's.
Thanks Jim and Perderbo for your answers.
$ cat locktest.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
main(void)
{
char buff[250];
FILE *F;
struct flock mylock;
int fd, iret,i;
fd = open("datafile", O_APPEND | O_RDWR);
mylock.l_type = F_WRLCK;
mylock.l_whence = SEEK_SET;
mylock.l_start = 0;
mylock.l_len = 0;
iret = fcntl(fd,F_SETLK, &mylock);
if (iret == -1) {
if ((errno == EACCES) || (errno == EAGAIN)) {
printf("locked \n");
exit(1);
} else {
printf("fcntl failed\n");
exit(1);
}
}
for(i=0;i<20;i++)
{
sleep(2);
write(fd,"A",1);
}
F = fdopen(fd, "r");
while (fgets(buff,250,F)) {
fputs(buff,stdout);
}
close(fd);
exit(0);
}
$cat locktest1.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
main(void)
{
char buff[250];
FILE *F;
struct flock mylock;
int fd, iret,i;
fd = open("datafile", O_APPEND | O_RDWR);
mylock.l_type = F_WRLCK;
mylock.l_whence = SEEK_SET;
mylock.l_start = 0;
mylock.l_len = 0;
iret = fcntl(fd,F_SETLK, &mylock);
if (iret == -1) {
if ((errno == EACCES) || (errno == EAGAIN)) {
printf("locked \n");
for(i=0;i<20;i++)
{
write(fd,"B",1);
}
exit(1);
} else {
printf("fcntl failed\n");
exit(1);
}
}
F = fdopen(fd, "r");
while (fgets(buff,250,F)) {
fputs(buff,stdout);
}
close(fd);
exit(0);
}
10 More Discussions You Might Find Interesting
1. UNIX for Dummies Questions & Answers
how can I lock my keyboard while I'm away from the computer without using lock command. What other commands gives me the option to lock keyboard device?
thanks (7 Replies)
Discussion started by: dianayun
7 Replies
2. UNIX for Dummies Questions & Answers
Hi,
We have a lock file being created called lck8c0001 created in Unixware 2.1.2. This is locking a printer.
According to some websites, 8c0001 relates to the device name.
How does one link 8c0001 to those devices listed in the /dev folder?
I have done a ps -lp for all printers and have... (4 Replies)
Discussion started by: canman
4 Replies
3. Shell Programming and Scripting
Hi,
My requirement is to service a process and below is the script which i wrote for that and works fine, I have kept it in a crontab and running this everyminute, how do I lock this if its already running and i dont want to open if its running and not completed yet.
The crontab need to run... (4 Replies)
Discussion started by: strunz
4 Replies
4. Shell Programming and Scripting
hi
how can I Lock an account, by prepending ”*LK*” to the password field in /etc/shadow.
I dont want to use passwd -l .
Any idea? (3 Replies)
Discussion started by: tjay83
3 Replies
5. Solaris
Hi,
I am working with Sun-Solaris 9 and in our application I need to connect the UPS with Serial port,after that I need to monitor it..but before stating communication,It should lock that port,To check it,first i am trying to make sure the lock directory exists and I am able to find it(/var/lock)... (0 Replies)
Discussion started by: smartgupta
0 Replies
6. Red Hat
Hello all,
If anyone has time, I have a few questions:
How do I do the following in Linux. We are using Red Hat and Oracle Enterprise Linux, which is based on Red Hat too.
1. How to lock the account after a few (like 3) invalid password attempts?
2. How do you lock a screen after 30... (1 Reply)
Discussion started by: nstarz
1 Replies
7. UNIX for Advanced & Expert Users
Hi all,
I have to test some user priviliges. The goal is to be sure that an unauthorized user can't restart some modules (ssh, mysql etc...).
I'm trying to automate it with a shell script but in same cases I got the syslog broadcast message.
Is there any way to simply get a return code... (3 Replies)
Discussion started by: Dedalus
3 Replies
8. Shell Programming and Scripting
Hi,
I want to write a code where in the file once taken genrates a lock number and other developer/user cannot take the file to make any changes in it. He gets the file only as read only. (2 Replies)
Discussion started by: rac
2 Replies
9. Ubuntu
Hi All!
I am not able to lock my Ubuntu 12.04 LXDE.
Can anybody tell me the shortcut to lock the system.
I have tried all conventional keyboard shortcuts as well as buttons. (2 Replies)
Discussion started by: nixhead
2 Replies
10. Shell Programming and Scripting
Requirement:First i need to unlock the directory which i had a script for it.If i select app1 it should unlock the directory and after chnages in the script once need to lock the directory with lock command
The below highlighed variables in lock and unlock has to be changed according... (2 Replies)
Discussion started by: bhas85
2 Replies
plock(3C) Standard C Library Functions plock(3C)
NAME
plock - lock or unlock into memory process, text, or data
SYNOPSIS
#include <sys/lock.h>
int plock(int op);
DESCRIPTION
The plock() function allows the calling process to lock or unlock into memory its text segment (text lock), its data segment (data lock),
or both its text and data segments (process lock). Locked segments are immune to all routine swapping. The effective user ID of the calling
process must be super-user to use this call.
The plock() function performs the function specified by op:
PROCLOCK Lock text and data segments into memory (process lock).
TXTLOCK Lock text segment into memory (text lock).
DATLOCK Lock data segment into memory (data lock).
UNLOCK Remove locks.
RETURN VALUES
Upon successful completion, 0 is returned. Otherwise, -1 is returned and errno is set to indicate the error.
ERRORS
The plock() function fails and does not perform the requested operation if:
EAGAIN Not enough memory.
EINVAL The op argument is equal to PROCLOCK and a process lock, a text lock, or a data lock already exists on the calling process; the op
argument is equal to TXTLOCK and a text lock or a process lock already exists on the calling process; the op argument is equal to
DATLOCK and a data lock or a process lock already exists on the calling process; or the op argument is equal to UNLOCK and no lock
exists on the calling process.
EPERM The {PRIV_PROC_LOCK_MEMORY} privilege is not asserted in the effective set of the calling process.
USAGE
The mlock(3C) and mlockall(3C) functions are the preferred interfaces for process locking.
ATTRIBUTES
See attributes(5) for descriptions of the following attributes:
+-----------------------------+-----------------------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+-----------------------------+-----------------------------+
|MT-Level |MT-Safe |
+-----------------------------+-----------------------------+
SEE ALSO
exec(2), exit(2), fork(2), memcntl(2), mlock(3C), mlockall(3C), attributes(5)
SunOS 5.10 22 Mar 2004 plock(3C)