Posix有名信号量的实现

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

int main(int argc, char *argv[])
{
    sem_t *sem = NULL;
    sem = sem_open(argv[1], O_CREAT | O_RDWR, 0666, atoi(argv[2]));
    if(sem == SEM_FAILED)
    {
        perror("sem_open error");
        exit(-1);
    }

    pid_t pid = fork();
    if(pid > 0)
    {
        int i;
        for(i = 0; i < 10; i++)
        {
            sem_wait(sem);
            printf("parent: pid = %ld, ppid=%ld, i= %d\n", (long)getpid(), (long)getppid(), i);
            sleep(1);
            sem_post(sem);
            sem_post(sem);
            sleep(1);
        }

        waitpid(pid, NULL, 0);
        sem_close(sem);
        sem_unlink(argv[1]);
        exit(0);
    }
    else
    {
        int i, val = -1;
        for(i = 0; i < 4; i++)
        {
            sem_wait(sem);
            sem_getvalue(sem, &val);
            printf("child: pid = %ld, ppid=%ld, i= %d, val= %d\n", (long)getpid(), (long)getppid(), i, val);
            sleep(2);
            sem_post(sem);
            sleep(1);
        }

        sem_close(sem);
    }
}

运行如下:

$ ./t03_sem /sem_03 1
parent: pid = 4346, ppid=2057, i= 0
child: pid = 4347, ppid=4346, i= 0, val= 1
parent: pid = 4346, ppid=2057, i= 1
child: pid = 4347, ppid=4346, i= 1, val= 2
parent: pid = 4346, ppid=2057, i= 2
parent: pid = 4346, ppid=2057, i= 3
child: pid = 4347, ppid=4346, i= 2, val= 2
parent: pid = 4346, ppid=2057, i= 4
child: pid = 4347, ppid=4346, i= 3, val= 5
parent: pid = 4346, ppid=2057, i= 5
parent: pid = 4346, ppid=2057, i= 6
parent: pid = 4346, ppid=2057, i= 7
parent: pid = 4346, ppid=2057, i= 8
parent: pid = 4346, ppid=2057, i= 9
posted @ 2022-05-14 16:26  桃花春风一杯酒  阅读(45)  评论(0)    收藏  举报