⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lock.c

📁 unix高级编程源代码.<<unix高级编程>>
💻 C
字号:
#include	"calld.h"

typedef struct {
  char	*line;	/* points to malloc()ed area */
  				/* we lock by line (device name) */
  pid_t	pid;	/* but unlock by process ID */
				/* pid of 0 means available */
} Lock;
static Lock	*lock = NULL;	/* the malloc'ed/realloc'ed array */
static int	 lock_size;		/* #entries in lock[] */
static int	 nlocks;		/* #entries currently used in lock[] */

/* Find the entry in lock[] for the specified device (line).
 * If we don't find it, create a new entry at the end of the
 * lock[] array for the new device.  This is how all the possible
 * devices get added to the lock[] array over time. */

static Lock *
find_line(char *line)
{
	int		i;
	Lock	*lptr;

	for (i = 0; i < nlocks; i++) {
		if (strcmp(line, lock[i].line) == 0)
			return(&lock[i]);	/* found entry for device */
	}
	/* Entry not found.  This device has never been locked before.
	   Add a new entry to lock[] array. */

	if (nlocks >= lock_size) {	/* lock[] array is full */
		if (lock == NULL)		/* first time through */
			lock = malloc(NALLOC * sizeof(Lock));
		else
			lock = realloc(lock, (lock_size + NALLOC) * sizeof(Lock));
		if (lock == NULL)
			err_sys("can't alloc for lock array");

		lock_size += NALLOC;
	}

	lptr = &lock[nlocks++];
	if ( (lptr->line = malloc(strlen(line) + 1)) == NULL)
		log_sys("calloc error");
	strcpy(lptr->line, line);	/* copy caller's line name */
	lptr->pid  = 0;
	return(lptr);
}

void
lock_set(char *line, pid_t pid)
{
	Lock	*lptr;

	log_msg("locking %s for pid %d", line, pid);
	lptr = find_line(line);
	lptr->pid  = pid;
}

void
lock_rel(pid_t pid)
{
	Lock	*lptr;

	for (lptr = &lock[0]; lptr < &lock[nlocks]; lptr++) {
		if (lptr->pid == pid) {
			log_msg("unlocking %s for pid %d", lptr->line, pid);
			lptr->pid  = 0;
			return;
		}
	}
	log_msg("can't find lock for pid = %d", pid);
}

pid_t
is_locked(char *line)
{
	return( find_line(line)->pid );	/* nonzero pid means locked */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -