C 故障信号灯

C 故障信号灯,c,semaphore,mkfifo,C,Semaphore,Mkfifo,我试图组织两个过程的交互。第一个进程发送第二个2个数字。第二个进程查找金额并将其传递给第一个进程。我使用一个命名的信号量来同步这些进程。在创建MKFIFO之后,我会阻止这个过程,这样它就不会提前打开它。此时,第二个进程打开先前创建的通道并将结果写入其中,然后释放第一个进程。但第二个进程没有看到为其创建第一个进程的通道。我做错了什么 测试c: #define SEMAPHORE_NAME "/my_named_semaphore" sem_t *sem; int f1,f2; double

我试图组织两个过程的交互。第一个进程发送第二个2个数字。第二个进程查找金额并将其传递给第一个进程。我使用一个命名的信号量来同步这些进程。在创建MKFIFO之后,我会阻止这个过程,这样它就不会提前打开它。此时,第二个进程打开先前创建的通道并将结果写入其中,然后释放第一个进程。但第二个进程没有看到为其创建第一个进程的通道。我做错了什么

测试c:

#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中发生的第一件事?看这里的文件对不起,我不明白你的问题