sem_fork.c

代码如下:

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <semaphore.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>

int main(int argc,char *argv[])
{
	int fd,i,count =0,nloop=10,zero=0,*ptr;
	sem_t mutex;
	fd = open("log.txt",O_RDWR | O_CREAT,S_IRWXU);
	write(fd,&zero,sizeof(int));
	ptr = mmap(NULL,sizeof(int),PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
	close(fd);
	if(sem_init(&mutex,1,1) < 0)
		exit(0);
	if(fork()==0)
	{
		for(i=0;i<nloop;i++)
		{
			sem_wait(&mutex);
			printf("child:%d\n",(*ptr)++);
			sem_post(&mutex);
		}
		exit(0);
	}

	for(i = 0;i<nloop;i++)
	{
		sem_wait(&mutex);
		printf("Parent:%d\n",(*ptr)++);
		sem_post(&mutex);
	}
	return 0;
}





在语言中,可以使用`sem_open()`函数创建一个具有给定名称的新信号量,或者打开一个已经存在的信号量。该函数的原型如下: ```c #include <semaphore.h> sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); ``` 其中,`name`参数是信号量的名称,在不同的进程中需要保证唯一性;`oflag`参数指定打开或创建标志,可以是`O_CREAT`(表示创建新的信号量)或`O_EXCL`(表示如果信号量已经存在,则返回错误);`mode`参数用于设置文件访问权限;`value`参数是信号量的初始值。 创建或打开信号量之后,就可以使用`sem_wait()`和`sem_post()`函数来进行信号量的等待和释放操作。`sem_wait()`会减小信号量的值,如果信号量的值为0,则会阻塞当前进程,直到信号量的值变为非0。`sem_post()`会增加信号量的值,并唤醒一个正在等待该信号量的进程。 下面是一个使用信号量进行进程同步的例子,其中包含两个进程,一个是父进程,另一个是子进程: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <semaphore.h> #include <fcntl.h> int main() { int pid; sem_t *sem; sem = sem_open("mysem", O_CREAT, 0644, 1); if (sem == SEM_FAILED) { perror("sem_open"); exit(1); } pid = fork(); if (pid < 0) { perror("fork"); exit(1); } else if (pid == 0) { /* child process */ sem_wait(sem); printf("child process\n"); sem_post(sem); } else { /* parent process */ sem_wait(sem); printf("parent process\n"); sem_post(sem); } sem_close(sem); sem_unlink("mysem"); return 0; } ``` 在该例子中,首先使用`sem_open()`函数创建一个名为`mysem`的信号量,并初始化为1。然后创建一个子进程,子进程和父进程都会执行`sem_wait()`和`sem_post()`操作。由于信号量的值初始为1,因此父进程会先运行,输出`parent process`,然后子进程才会运行,输出`child process`。最后,关闭信号量并删除它。 需要注意的是,在使用完信号量之后,需要调用`sem_close()`函数关闭信号量,并调用`sem_unlink()`函数删除信号量(如果不再需要该信号量)。另外,如果使用了`O_CREAT`标志创建了一个新信号量,还需要在程序结束时调用`sem_unlink()`函数删除该信号量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值