C 故障信号灯
我试图组织两个过程的交互。第一个进程发送第二个2个数字。第二个进程查找金额并将其传递给第一个进程。我使用一个命名的信号量来同步这些进程。在创建MKFIFO之后,我会阻止这个过程,这样它就不会提前打开它。此时,第二个进程打开先前创建的通道并将结果写入其中,然后释放第一个进程。但第二个进程没有看到为其创建第一个进程的通道。我做错了什么 测试c:C 故障信号灯,c,semaphore,mkfifo,C,Semaphore,Mkfifo,我试图组织两个过程的交互。第一个进程发送第二个2个数字。第二个进程查找金额并将其传递给第一个进程。我使用一个命名的信号量来同步这些进程。在创建MKFIFO之后,我会阻止这个过程,这样它就不会提前打开它。此时,第二个进程打开先前创建的通道并将结果写入其中,然后释放第一个进程。但第二个进程没有看到为其创建第一个进程的通道。我做错了什么 测试c: #define SEMAPHORE_NAME "/my_named_semaphore" sem_t *sem; int f1,f2; double
#define SEMAPHORE_NAME "/my_named_semaphore"
sem_t *sem;
int f1,f2;
double summ = 0;
unlink("mk.fifo");
if (mkfifo("mk.fifo", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1 && errno != EEXIST)
error(0, errno, "mkfifo() error");
f1 = open("mk.fifo", O_WRONLY);
perror("Opening ");
write(f1, &a, sizeof(double));
write(f1, &b, sizeof(double));
perror("Writing ");
close(f1);
unlink("mk.fifoSumm");
if (mkfifo("mk.fifoSumm", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1 && errno != EEXIST)
error(0, errno, "mkfifo() error");
sem = sem_open(SEMAPHORE_NAME, O_CREAT, 0777, 0);
printf("зашли в семафор\n");
printf("ждем\n");
sem_wait(sem);
printf("подождали\n");
f2 = open("mk.fifoSumm", O_RDONLY);
perror("Opening ");
read(f2, &summ, sizeof(double));
perror("Reading ");
close(f2);
printf("Received string '%lf'\n", summ);
return summ;
}
测试2.c:
#define SEMAPHORE_NAME "/my_named_semaphore"
sem_t *sem;
int f2,f1;
double a = 0;
double b = 0;
double summ = 0;
f2 = open("mk.fifo", O_RDONLY);
perror("Opening ");
read(f2, &a, sizeof(double));
read(f2, &b, sizeof(double));
perror("Reading ");
close(f2);
printf("Received string '%lf'\n", a);
printf("Received string '%lf'\n", b);
summ = a + b;
sem = sem_open(SEMAPHORE_NAME, 0);
f1 = open("mk.fifoSumm", O_WRONLY);
perror("Opening ");
write(f1, &summ, sizeof(double));
perror("Writing ");
sem_post(sem);
printf("освободили семафор\n");
close(f1);
看起来是基于错误的计时问题。写入fifo会被阻止,直到另一端连接到某个设备,因此test2基本上是在创建fifo之前尝试打开fifo(因为test2尝试在测试开始创建fifo之前打开fifo以写入结果)。您是否尝试过将两个mkfifo调用作为test.c中发生的第一件事?看这里的文件对不起,我不明白你的问题