此代码运行良好,但消费者进程不起作用,我试图获取Producer_PID值并判断发生了什么,但当我编写printf("%d\n",Producer_Pid)时,它在不放置时给出两个值\n它给出一个值.我对所有的计算机编程都是新手,我正在自学,如果问题这么糟糕,我很抱歉

我认为制片人流程没有结束任何可能对我有帮助的 idea ?

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define BUFFER_SIZE 2

int buffer[BUFFER_SIZE];
int sayac = 0;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void produce(int item) {
    buffer[sayac] = item;
    sayac++;
}

int consume() {
    int item = buffer[sayac - 1];
    sayac--;
    return item;
}

void *producer_thread(void *arg) {
    int *pipe_fd = (int *)arg;

    for (int i = 1; i <= 10; i++) {
        pthread_mutex_lock(&mutex);
        while (sayac == BUFFER_SIZE) {
            pthread_mutex_unlock(&mutex);
            usleep(100000);  // Kısa bir süre bekleyerek döngüyü serbest bırak
            pthread_mutex_lock(&mutex);
        }

        produce(i);
        printf("Üretici: %d üretildi.\n", i);

        write(pipe_fd[1], &i, sizeof(i));

        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
    close(pipe_fd[1]);
    return NULL;
}

void *consumer_thread(void *arg) {
    int *pipe_fd = (int *)arg;

    for (int i = 1; i <= 10; i++) {
        pthread_mutex_lock(&mutex);
        while (sayac == 0) {
            pthread_mutex_unlock(&mutex);
            usleep(100000);  // Kısa bir süre bekleyerek döngüyü serbest bırak
            pthread_mutex_lock(&mutex);
        }

        int item = consume();
        printf("Tüketici: %d tüketildi.\n", item);

        int received_data;
        read(pipe_fd[0], &received_data, sizeof(received_data));

        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
    close(pipe_fd[0]);
    return NULL;
}

int main() {
    int pipe_fd[2];
    if (pipe(pipe_fd) == -1) {
        perror("Pipe oluşturulamadı");
        return 1;
    }

    pid_t producer_pid = fork();
    printf("%d ---------------",producer_pid);

    if (producer_pid == 0) {
        // Yavru üretici işlem kodu
        close(pipe_fd[0]); // Okuma tarafını kapat
        producer_thread((void *)pipe_fd);
        exit(0);
    } else if (producer_pid > 0) {
        pid_t consumer_pid = fork();

        if (consumer_pid == 0) {
            // Yavru tüketici işlem kodu
            close(pipe_fd[1]); // Yazma tarafını kapat
            consumer_thread((void *)pipe_fd);
            exit(0);
        } else if (consumer_pid > 0) {
            // Ana işlem kodu
            close(pipe_fd[0]); // Okuma tarafını kapat
            close(pipe_fd[1]); // Yazma tarafını kapat

            wait(NULL);
            wait(NULL);

            printf("Ana işlem tamamlandı.\n");
        } else {
            fprintf(stderr, "Tüketici işlem oluşturulamadı.\n");
            return 1;
        }
    } else {
        fprintf(stderr, "Üretici işlem oluşturulamadı.\n");
        return 1;
    }

    return 0;
}

推荐答案

这里的主要问题是,您正在打开一个pThREAD互斥体,以便在使用fork()打开的进程之间进行同步.

顾名思义,pthreadmutex被设计为在线程之间同步. 它将无法在使用fork创建的进程之间进行同步,因为这些进程将具有不同的内存空间.

对于您的实现来说,甚至使用pthreadmutex都没有多大意义.WRITE()和READ()被阻塞,因此您可以通过使用管道来同步这两个进程.

在不同的主题上,当您使用printf()时,有时操作系统会等待,并且不会打印所有日志(log).使用fflush()查看所有日志(log).

C++相关问答推荐

为什么下面的C代码会进入无限循环?

为什么在C中进行大量的位移位?

为什么I2C会发送错误的数据?

带有sigLongjMP中断I/O的异常处理程序

如何在下面的C代码中正确管理内存?

在移动数组元素时获得意外输出

关于";*(++p)->;t";、&++p->;t";和&q;++*p->;t";的问题

如何使用C++在控制台中以彩色打印被阻止的客户端

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

我在C中运行和调试时得到了不同的输出

我正在try 将QSORT算法实现为C++中的泛型函数

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

为什么我的半数组测试和奇数组测试不起作用?(我使用Assert进行调试)

传递给函数的 struct 中的数组

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

将不同类型的指针传递给函数(C)

添加/删除链表中的第一个元素

如何向 execl 创建的后台程序提供输入?

如何在 C 中的 Postgres 函数的表中 for 循环

如何根据当前舍入方向将float转换为int?