具有共享内存的消费者和生产者进程

问题描述 投票:0回答:1

我正在学习信号量atm,并正在改进程序以使其高效。但是我在那部分停留在那我该如何将程序更改为那些过程:将生产者值设置为共享内存和使用者不带任何值并从共享内存返回第一个值。如果没有可用的值,它将等待程序等待生产者存储该值。

如何链接?我可以得到任何想法或建议吗?

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

int main(){
    int i;
    int shm_id;
    pid_t pid;
    int *addr; 
    int data;
    pid_t current_pid;
    key_t shm_key;
    sem_t *sem;

    shm_key = ftok("/dev/null", 65);
    shm_id = shmget(shm_key, sizeof(int), 0644 | IPC_CREAT);
    if (shm_id < 0){
        perror("shmget");
        exit(EXIT_FAILURE);
    }

    sem_unlink("semaphore");
    sem = sem_open("semaphore", O_CREAT, 0644, 1);
    if (sem == SEM_FAILED) {
        perror("sem_open");
        exit(EXIT_FAILURE);
    } 

    addr = (int *) shmat(shm_id, (void *) 0, 0);   
    if (addr == (void *) -1) {
        perror("shmat");
        exit(EXIT_FAILURE);
    }
    *addr = 0;

    for (i = 0; i < 2; i++){
        pid = fork();
        if (pid < 0)
        {
            perror("fork");
            sem_close(sem);
            sem_unlink("semaphore");
            exit(EXIT_FAILURE);
        }
    }


    if (pid == 0)
    {
    current_pid = getpid();
        printf("Child %d: waiting for critical section \n", current_pid);
        sem_wait(sem);
        printf("Child %d: enters in critical section \n", current_pid);
        printf("child %d: Enter the data:\n", current_pid);
        scanf("%d", &data);
        printf("Child %d: new value of data = %d\n", current_pid, data);
        printf("Child %d: sum of whole data so far = %d\n", current_pid, *addr += data);
        sem_post(sem);
    printf("Child %d exits from critical section\n", current_pid);
        exit(EXIT_SUCCESS);
    }
    else if (pid > 0)
    {
        //parent process
        while (pid = waitpid(-1, NULL, 0))
        {
            if (errno == ECHILD)
            {
                break;
            }
        }
        puts("All children exited");
        shmdt(addr);
        shmctl(shm_id, IPC_RMID, 0);
        sem_close(sem);         
        sem_unlink("semaphore");
        exit(0);
    }

    exit(0);
}
c posix multithreading shared-memory semaphore
1个回答
0
投票

关于:

for (i = 0; i < 2; i++)
{
    pid = fork();
    if (pid < 0)
    {
        perror("fork");
        sem_close(sem);
        sem_unlink("semaphore");
        exit(EXIT_FAILURE);
    }
}

如果对fork()的调用没有失败,则将有4个进程在运行,

但是,如果对fork()的3个调用中的任何一个失败,则一个(或多个)正在运行的进程将失去其父进程。

过去,这会导致一个或多个僵尸进程。现在,孤立的进程(至少在Linux中)将附加到init进程

发布的代码无法解决上述任何问题。

确切地说,您要完成什么?

从代码的这一点开始(假设对fork()的所有调用均成功完成:]]

 if (pid == 0)

将有4个进程执行此代码。由于上述循环中的混乱,只有某些进程将进入此if()语句。其他进程将输入此语句:

else if (pid > 0)

但是,变量pid中的值将被覆盖几次,因此很难确定哪个进程将看到pid的值。

所以,再次,代码到底要完成什么?

© www.soinside.com 2019 - 2024. All rights reserved.