【发布时间】:2018-01-22 12:27:46
【问题描述】:
我正在尝试使用 1 个父进程和 1 个子进程来实现生产者-消费者应用程序。该程序应该像这样工作:
1 - 父进程是生产者,子进程是消费者。
2 - 生产者创建文件,消费者删除文件。
3 - 创建文件后,父进程向子进程发送 SIGUSR1 信号,然后子进程删除文件并向父进程发送 SIGUSR2 信号,表示可以再次创建文件。
我已尝试实现此问题,但我不断收到此错误:
User defined signal 1: 30.
我真的不明白可能是什么问题。我刚刚开始学习过程和信号,也许我错过了一些东西。任何帮助,将不胜感激。这是我的实现:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
pid_t child, parent;
void producer()
{
system("touch file");
printf("File was created.\n");
}
void consumer()
{
system("rm file");
printf("File was deleted.\n");
kill(parent, SIGUSR2); // signal -> file can created by parent
}
int main(void)
{
system("touch file");
pid_t pid = fork();
for(int i = 0; i < 10; ++i)
{
if(pid < 0) // error fork()
{
perror("fork()");
return -1;
}
else if(pid == 0) // child proces - consumer
{
child = getpid();
signal(SIGUSR1, consumer);
pause();
}
else // parent process - producer
{
parent = getpid();
signal(SIGUSR2, producer);
// signal -> file can be deleted by child
kill(child, SIGUSR1);
}
}
return 0;
}
编辑:我忘了说一次只能有一个文件。
【问题讨论】:
-
我没有详细阅读您的问题,但您的应用中似乎存在竞争条件,因此我为您提供了一个替代方案,并且可能对您有用:您可以设置内存父进程和子进程之间共享的区域并将其用作互斥数据结构(例如自旋锁),并且在父进程和子进程之间引入互斥体可能会有所帮助。
-
互斥锁是否在进程之间工作?我以为它只能在多个线程之间工作。
-
@sziko - 是的,有 process-shared mutexes。 (这将是一种解决方法,但不能解决您问题中的主要问题)。您是否尝试过以下答案中的同步链接?如果你能让它发挥作用,它将让你了解可能导致你的代码挂起的原因。
标签: c linux operating-system producer-consumer