英文:
how can i run these two proceses normally in c language?
问题
这段代码运行正常,但消费者进程不工作,我尝试获取producer_pid
的值并检查发生了什么情况,但当我写下printf("%d\n", producer_pid)
时,不加\n
时它会输出两个值,加上\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); // Wait for a short time and release the loop
pthread_mutex_lock(&mutex);
}
produce(i);
printf("Producer: %d produced.\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); // Wait for a short time and release the loop
pthread_mutex_lock(&mutex);
}
int item = consume();
printf("Consumer: %d consumed.\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 could not be created");
return 1;
}
pid_t producer_pid = fork();
printf("%d ---------------", producer_pid);
if (producer_pid == 0) {
// Child producer process code
close(pipe_fd[0]); // Close the reading end
producer_thread((void *)pipe_fd);
exit(0);
} else if (producer_pid > 0) {
pid_t consumer_pid = fork();
if (consumer_pid == 0) {
// Child consumer process code
close(pipe_fd[1]); // Close the writing end
consumer_thread((void *)pipe_fd);
exit(0);
} else if (consumer_pid > 0) {
// Main process code
close(pipe_fd[0]); // Close the reading end
close(pipe_fd[1]); // Close the writing end
wait(NULL);
wait(NULL);
printf("Main process completed.\n");
} else {
fprintf(stderr, "Consumer process could not be created.\n");
return 1;
}
} else {
fprintf(stderr, "Producer process could not be created.\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()是阻塞的,所以您可以通过使用pipe来使这两个进程同步。
另外,当您使用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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论