File locks for linux

半腔热情 提交于 2019-11-30 18:51:02

tempnam doesn't create the file, it just gives you a filename that didn't exist at the time you called it.

You still have to create the file yourself and therefore still have the race condition that another process may sneak in and create it before you.

You don't actually want to use tempnam since that will give each process its own file name and they will be able to run concurrently. What you need is a fixed file name (like /tmp/myapp.lck for example) which each process opens and then attempts to flock.

You're better off with flock for a lock file, fcntl will give you a finer grain of locking (parts of files) but that's not really a requirement here.

The code would run something like this:

if ((mylockfd = open ("/tmp/myapp.lck", O_CREAT | O_RDWR, 0666)) < 0) {
    // error, couldn't open it.
    return;
}
if (flock (mylockfd, LOCK_EX | LOCK_NB) < 0) {
    // error, couldn't exclusive-lock it.
    return;
}
:
// Weave your magic here.
:
flock (mylockfd, LOCK_UN);

That probably needs some work but should be a good start. A more generalised solution would be something like:

int acquireLock (char *fileSpec) {
    int lockFd;

    if ((lockFd = open (fileSpec, O_CREAT | O_RDWR, 0666))  < 0)
        return -1;

    if (flock (mylockfd, LOCK_EX | LOCK_NB) < 0) {
        close (lockFd);
        return -1;
    }

    return lockFd;
}

void releaseLock (int lockFd) {
    flock (lockFd, LOCK_UN);
    close (lockFd);
}

// Calling code here.

int fd;
if ((fd = acquireLock ("/tmp/myapp.lck")) < 0) {
    fprintf (stderr, "Cannot get lock file.\n");
    return 1;
}

// Weave your magic here.

releaseLock (fd);
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!