现在的位置: 首页 > 综合 > 正文

一个父子进程用信号量同步的例子

2011年09月16日 ⁄ 综合 ⁄ 共 1360字 ⁄ 字号 评论关闭

一个父子进程用信号量同步的例子,父子进程交替打印信息。

#include &ltstdio.h&gt
#include &ltstdlib.h&gt
#include &ltsys/types.h&gt
#include &ltsys/ipc.h&gt
#include &ltsys/sem.h&gt
#include &ltsys/stat.h&gt

#define VERIFYERR(a, b)							\
	if (a) { fprintf(stderr, "%s failed. \n", b); exit(1); }

/* this union copy from /usr/include/bits/sem.h */
union semun
{
	int val;
	struct semid_ds *buf;
	unsigned short int *array;
	struct seminfo *__buf;
};

int main(void)
{
	int i = 0, semid;
	pid_t pid;
	struct sembuf sb;
	union semun sem;
	VERIFYERR((semid = semget(1000, 2, 0666 | IPC_CREAT)) &lt 0, "semid");
/* initialize sem value = 1  */
	sem.val = 1;
	VERIFYERR(semctl(semid, 0, SETVAL, sem) == -1, "semctl");
	sem.val = 0;
	VERIFYERR(semctl(semid, 1, SETVAL, sem) == -1, "semctl");

	pid = fork();
	switch (pid) {
	case -1:
		perror("fork fail");
		break;
	case 0: /* child consume */
		while (i != 10) {
			sb.sem_num = 1;
			sb.sem_op = -1;
			sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT;
			VERIFYERR(semop(semid, &sb, 1) != 0, "child semop");

			fprintf(stderr, "child process %d\n", (int)getpid());
			sb.sem_op = 1;          
			sleep(1);

			sb.sem_num = 0;
			sb.sem_op = 1;
			sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT;
			VERIFYERR(semop(semid, &sb, 1) != 0, "child semop");
			++i;
		}
		break;
	default:/* parent production  */
		while (i != 10) {
			sb.sem_num = 0;
			sb.sem_op = -1;
			sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT;
			VERIFYERR(semop(semid, &sb, 1) != 0, "parent semop");

			fprintf(stderr, "parent process %d\n", (int)getpid());
			sb.sem_op = 1;
			sleep(1);

			sb.sem_num = 1;
			sb.sem_op = 1;
			sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT;
			VERIFYERR(semop(semid, &sb, 1) != 0, "parent semop");
			++i;
		}
		break;
	}

	return 0;
}


抱歉!评论已关闭.