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

📄 pendlock.c

📁 unix环境高级编程第二版配套源代码 unix环境高级编程第二版配套源代码
💻 C
字号:
#include "apue.h"#include <fcntl.h>#include <errno.h>voidsigint(int signo){}intmain(void){	pid_t pid1, pid2, pid3;	int fd;	setbuf(stdout, NULL);	signal_intr(SIGINT, sigint);	/*	 * Create a file.	 */	if ((fd = open("lockfile", O_RDWR|O_CREAT, 0666)) < 0)		err_sys("can't open/create lockfile");	/*	 * Read-lock the file.	 */	if ((pid1 = fork()) < 0) {		err_sys("fork failed");	} else if (pid1 == 0) {	/* child */		if (lock_reg(fd, F_SETLK, F_RDLCK, 0, SEEK_SET, 0) < 0)			err_sys("child 1: can't read-lock file");		printf("child 1: obtained read lock on file\n");		pause();		printf("child 1: exit after pause\n");		exit(0);	} else {		/* parent */		sleep(2);	}	/*	 * Parent continues ... read-lock the file again.	 */	if ((pid2 = fork()) < 0) {		err_sys("fork failed");	} else if (pid2 == 0) {	/* child */		if (lock_reg(fd, F_SETLK, F_RDLCK, 0, SEEK_SET, 0) < 0)			err_sys("child 2: can't read-lock file");		printf("child 2: obtained read lock on file\n");		pause();		printf("child 2: exit after pause\n");		exit(0);	} else {		/* parent */		sleep(2);	}	/*	 * Parent continues ... block while trying to write-lock	 * the file.	 */	if ((pid3 = fork()) < 0) {		err_sys("fork failed");	} else if (pid3 == 0) {	/* child */		if (lock_reg(fd, F_SETLK, F_WRLCK, 0, SEEK_SET, 0) < 0)			printf("child 3: can't set write lock: %s\n",			  strerror(errno));		printf("child 3 about to block in write-lock...\n");		if (lock_reg(fd, F_SETLKW, F_WRLCK, 0, SEEK_SET, 0) < 0)			err_sys("child 3: can't write-lock file");		printf("child 3 returned and got write lock????\n");		pause();		printf("child 3: exit after pause\n");		exit(0);	} else {		/* parent */		sleep(2);	}	/*	 * See if a pending write lock will block the next	 * read-lock attempt.	 */	if (lock_reg(fd, F_SETLK, F_RDLCK, 0, SEEK_SET, 0) < 0)		printf("parent: can't set read lock: %s\n",		  strerror(errno));	else		printf("parent: obtained additional read lock while"		  " write lock is pending\n");	printf("killing child 1...\n");	kill(pid1, SIGINT);	printf("killing child 2...\n");	kill(pid2, SIGINT);	printf("killing child 3...\n");	kill(pid3, SIGINT);	exit(0);}

⌨️ 快捷键说明

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