英文:
how can i run these two proceses normally in c language?
问题
这段代码运行正常,但消费者进程不工作,我尝试获取producer_pid的值并检查发生了什么,但当我写printf("%d\n", producer_pid)时,如果不加\n,它只给出一个值。我对计算机编程一无所知,我正在自学,如果问题很糟糕,我很抱歉。
我认为生产者进程没有结束,有什么办法可以帮助我吗?
#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); // 短暂等待以释放循环
pthread_mutex_lock(&mutex);
}
produce(i);
printf("生产者: %d 已生产。\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); // 短暂等待以释放循环
pthread_mutex_lock(&mutex);
}
int item = consume();
printf("消费者: %d 已消费。\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("无法创建管道");
return 1;
}
pid_t producer_pid = fork();
printf("%d ---------------", producer_pid);
if (producer_pid == 0) {
// 子生产者进程代码
close(pipe_fd[0]); // 关闭读取端
producer_thread((void *)pipe_fd);
exit(0);
} else if (producer_pid > 0) {
pid_t consumer_pid = fork();
if (consumer_pid == 0) {
// 子消费者进程代码
close(pipe_fd[1]); // 关闭写入端
consumer_thread((void *)pipe_fd);
exit(0);
} else if (consumer_pid > 0) {
// 主进程代码
close(pipe_fd[0]); // 关闭读取端
close(pipe_fd[1]); // 关闭写入端
wait(NULL);
wait(NULL);
printf("主进程完成。\n");
} else {
fprintf(stderr, "无法创建消费者进程。\n");
return 1;
}
} else {
fprintf(stderr, "无法创建生产者进程。\n");
return 1;
}
return 0;
}
英文:
this code works fine but consumer process does not work, i tried to get producer_pid value and check what is going on but when i write the printf("%d\n",producer_pid) it gives two values when do not put \n it gives one value. i am new to all computer programming i am educating myself, if the question is so bad i am sorry
i think producer process is not ending any idea that could help me?
#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;
}
答案1
得分: 1
这里的主要问题是你正在打开一个 pthread 互斥锁来同步使用 fork() 创建的进程之间的操作。
pthread_mutex,顾名思义,是设计用于线程之间的同步的。它无法在使用 fork 创建的进程之间进行同步,因为这些进程将拥有不同的内存空间。
对于你的实现,甚至没有必要使用 pthread_mutex。write() 和 read() 是阻塞的,所以你可以通过使用管道来实现两个进程的同步。
另外,当你使用 printf() 时,有时操作系统会等待而不打印所有的日志。使用 fflush() 来查看所有的日志。
英文:
the main problem here is that you're opening a pthread mutex to sync between processes opened using fork().
pthread_mutex, as its name would suggest, is designed to sync between threads.
It will not be able to sync between processes created using fork since the processes will have a different memory space.
For your implementation, there isn't much of a point to even use pthread_mutex. write() and read() are blocking, so you can have both processes sync by using the pipe.
On a different subject, when you use printf(), sometimes the OS will wait and not print all of the log. use fflush() to see all your logs.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论