【无标题】

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <sys/ipc.h>

#include <sys/sem.h>

 

#define SEM_KEY 0x1234

#define MAX_COUNT 10

 

void P(int semID);

void V(int semID);

 

union semun {

    int val;

    struct semid_ds *buf;

    ushort *array;

};

 

int main() {

    int semID, i, pid;

    union semun sem_union;

 

    // 创建信号量

    semID = semget(SEM_KEY, 1, IPC_CREAT | 0666);

    if (semID == -1) {

        perror("semget failed");

        exit(EXIT_FAILURE);

    }

 

    // 初始化信号量值为1

    sem_union.val = 1;

    if (semctl(semID, 0, SETVAL, sem_union) == -1) {

        perror("semaphore initialization failed");

        exit(EXIT_FAILURE);

    }

 

    for (i = 0; i < 2; i++) {

        pid = fork();

        if (pid == 0 || pid == -1) {

            break;

        }

    }

 

    if (pid == -1) {

        perror("fork failed");

        exit(EXIT_FAILURE);

    }

 

    if (pid == 0) { // 子进程1和子进程2

        for (i = 1; i <= MAX_COUNT; i++) {

            P(semID);

            // 子进程1打印son,子进程2打印daughter

            printf("%s %d\n", (i == 0) ? "son" : "daughter", i);

            fflush(stdout);

            V(semID);

            sleep(1);

        }

        exit(EXIT_SUCCESS); // 子进程执行完成后退出

    } else {

        // 父进程的打印任务

        for (i = 1; i <= MAX_COUNT; i++) {

            P(semID);

            printf("parent %d\n", i);

            fflush(stdout);

            V(semID);

            sleep(1);

        }

 

        // 等待子进程结束

        while (wait(NULL) > 0);

 

        // 销毁信号量

        if (semctl(semID, 0, IPC_RMID, sem_union) == -1) {

            perror("Failed to delete semaphore");

        }

        

        exit(EXIT_SUCCESS);

    }

}

 

void P(int semID) {

    struct sembuf sop;

    sop.sem_num = 0;

    sop.sem_op = -1; // P操作

    sop.sem_flg = SEM_UNDO;

    if (semop(semID, &sop, 1) == -1) {

        perror("P operation failed");

        exit(EXIT_FAILURE);

    }

}

 

void V(int semID) {

    struct sembuf sop;

    sop.sem_num = 0;

    sop.sem_op = 1; // V操作

    sop.sem_flg = SEM_UNDO;

    if (semop(semID, &sop, 1) == -1) {

        perror("V operation failed");

        exit(EXIT_FAILURE);

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值