📄 lockfile.c
字号:
/*** Copyright (C) 1999-2000 Open System Telecom Corporation.** ** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.** ** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the** GNU General Public License for more details.** ** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.**** As a special exception to the GNU General Public License, permission is** granted for additional uses of the text contained in its release** of ACS as noted here.**** This exception is that permission is hereby granted to link ACS with** the Pika MonteCarlo static libraries to produce a executable image** without requiring MonteCarlo itself to be supplied in source form so** long as each source file so linked contains this exclusion.**** This exception does not however invalidate any other reasons why** the resulting executable file might be covered by the GNU General** public license or invalidate the licensing requirements of any** other component or library.**** This exception applies only to the code released by OST under the** name ACS. If you copy code from other releases into a copy of** ACS, as the General Public License permits, the exception does not** apply to the code that you add in this way. To avoid misleading** anyone as to the status of such modified files, you must delete** this exception notice from them.**** If you write modifications of your own to ACS, it is your choice** whether to permit this exception to apply to your modifications.** If you do not wish that, delete this exception notice, at which** point the terms of your modification would be covered under the GPL** as explicitly stated in "COPYING".*/#include <config.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <errno.h>#include <sys/stat.h>#include <lockfile.h>#ifndef _LOCK_FORMAT#define _LOCK_FORMAT "%010d %s"#endifint lockfile(const char *fpath, const char *option){ int fd; int status; pid_t pid; time_t now; struct stat ino; int len; int mask; char query[65]; if(!option) option = ""; for(;;) { fd = open(fpath, O_WRONLY | O_CREAT | O_EXCL, 0660); if(fd > 0) { pid = getpid(); if(!strcmp(option, "disable")) pid = 1; sprintf(query, _LOCK_FORMAT, pid, option); write(fd, query, strlen(query)); close(fd); return 0; } if(fd < 0 && errno != EEXIST) return -1; fd = open(fpath, O_RDONLY); if(fd < 0) { if(errno == ENOENT) continue; return -1; } sleep(2); status = read(fd, query, sizeof(query) - 1); if(status < 1) { close(fd); continue; } query[status] = 0; pid = atoi(query); if(pid) { if(pid == getpid()) { status = -1; errno = 0; } else status = kill(pid, 0); if(!status || (errno == EPERM)) { close(fd); return pid; } } close(fd); unlink(fpath); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -