C 通过fifo队列linux进行通信
这就是我们的任务:编写三个通过fifo队列进行通信的程序。第一个程序将发送偶数,第二个程序将发送奇数,第三个程序将接收 将数字相加。所有流程都应在屏幕上显示其工作结果 屏幕。 我试图解决它,但我的代码工作不正常,可能在3程序的问题,请帮助。C 通过fifo队列linux进行通信,c,linux,ubuntu,unix,C,Linux,Ubuntu,Unix,这就是我们的任务:编写三个通过fifo队列进行通信的程序。第一个程序将发送偶数,第二个程序将发送奇数,第三个程序将接收 将数字相加。所有流程都应在屏幕上显示其工作结果 屏幕。 我试图解决它,但我的代码工作不正常,可能在3程序的问题,请帮助。 第一个程序应发送偶数,第二个程序应发送奇数,第三个程序应接收并将这些数字相加(总和)。第一个和第二个程序似乎执行了它们的任务,但第三个程序没有执行,并且冻结 我的代码: //1计划 #include <stdio.h> #include <
第一个程序应发送偶数,第二个程序应发送奇数,第三个程序应接收并将这些数字相加(总和)。第一个和第二个程序似乎执行了它们的任务,但第三个程序没有执行,并且冻结 我的代码: //1计划
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
void prog1(int descriptor,char *fifo)
{
int a=0;
int i=0;
while (i!=10)
{
a+=2;
descriptor = open(fifo, O_WRONLY);
write(descriptor,&a, sizeof(a)+1);
puts("");
printf(" Even number : %d",a);
close(descriptor);
i++;
}
}
int main()
{
int descriptor;
char * fifo = "/tmp/myfifo_file";
mkfifo(fifo, 0666);
prog1(descriptor,fifo);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
void prog1(整型描述符,字符*fifo)
{
int a=0;
int i=0;
而(i!=10)
{
a+=2;
描述符=打开(仅限fifo、O_);
写入(描述符,&a,大小为(a)+1);
认沽权(“”);
printf(“偶数:%d”,a);
关闭(描述符);
i++;
}
}
int main()
{
整数描述符;
char*fifo=“/tmp/myfifo_文件”;
mkfifo(fifo,0666);
prog1(描述符,fifo);
返回0;
}
//2方案
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
void prog2(int descriptor,char *fifo)
{
int b=1;
int i=0;
while (i!=10)
{
descriptor = open(fifo, O_WRONLY);
write(descriptor, &b, sizeof(b)+1);
puts("");
printf("Odd number : %d",b);
b+=2;
close(descriptor);
i++;
}
}
int main()
{
int descriptor;
char * fifo = "/tmp/myfifo_file";
mkfifo(fifo, 0666);
prog2(descriptor,fifo);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
void prog2(整数描述符,字符*fifo)
{
int b=1;
int i=0;
而(i!=10)
{
描述符=打开(仅限fifo、O_);
写入(描述符,&b,大小为(b)+1);
认沽权(“”);
printf(“奇数:%d”,b);
b+=2;
关闭(描述符);
i++;
}
}
int main()
{
整数描述符;
char*fifo=“/tmp/myfifo_文件”;
mkfifo(fifo,0666);
prog2(描述符,fifo);
返回0;
}
//3计划
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
void prog3(int descriptor,char *fifo)
{
int *a;
int *b;
int i=0;
while (i!=10)
{
descriptor = open(fifo, O_RDONLY);
read(descriptor,a, sizeof(a));
close(descriptor);
descriptor = open(fifo, O_RDONLY);
read(descriptor,b, sizeof(b));
close(descriptor);
printf("Sum : %d",(*a)+(*b));
i++;
}
}
int main()
{
int descriptor;
char * fifo = "/tmp/myfifo_file";
mkfifo(fifo, 0666);
prog3(descriptor,fifo);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
void prog3(整型描述符,字符*fifo)
{
int*a;
int*b;
int i=0;
而(i!=10)
{
描述符=打开(仅限fifo、Ordu);
读取(描述符,a,sizeof(a));
关闭(描述符);
描述符=打开(仅限fifo、Ordu);
读取(描述符,b,sizeof(b));
关闭(描述符);
printf(“总和:%d”,(*a)+(*b));
i++;
}
}
int main()
{
整数描述符;
char*fifo=“/tmp/myfifo_文件”;
mkfifo(fifo,0666);
prog3(描述符,fifo);
返回0;
}
除了使用正确的地址和要读取的数据大小时出错外,主要错误是不应重复打开和关闭循环中的FIFO
打开FIFO进行读取或写入将阻塞,直到另一端也打开。因此,prog1和prog2将等待prog3打开FIFO进行读取,prog3将等待至少一个prog1和prog2打开FIFO进行写入
关闭写入端的FIFO将导致读取端出现EOF情况。关闭读取端的FIFO将导致写入端出现“断管”错误
程序也缺少错误处理mkfifo
,open
,read
,write
,close
可能返回错误,read
和write
也可能返回比您想要读取或写入的字节数少的字节数。在您的示例中,这可能不会发生在您的少量数据上,但是当您尝试传输大量数据时,您很可能会注意到这一点
以下是您的程序的改进版本:
程序1
到底发生了什么事?请提供更多关于代码实际功能的详细信息,而不是应该功能的详细信息。第一个程序应发送偶数,第二个程序应发送奇数,第三个程序应接收并将这些数字相加(总和)。第一个和第二个程序似乎执行了它们的任务,但第三个程序没有执行,并且冻结。@HIPHOP请回答您的问题,并在那里添加所有要求的信息或说明,而不是写注释。如果您想在prog 1和prog 2中写二进制整数值,您应该使用
write(描述符,&b,sizeof(b))代码>。您当前的程序将把存储在b
中的数字解释为一个地址,并从该地址读取比int
大一个字节的数据。这是未定义的行为。您的程序将发送垃圾数据,甚至可能崩溃。代码中的某些错误会产生编译器警告。也许你必须启用警告。请修复所有警告。您在prog3中有相同的错误。现在在prog3中使用未初始化的指针a
和b
。不要使用sizeof(b)+1
。这也将在保存变量b
的内存结束后读取一个字节。与我之前评论中的代码进行比较。顺便说一句:不能保证prog3将从prog1读取一个值,从prog2读取一个值。例如,prog1首先写入所有值,然后prog2写入所有值。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
void prog1(char *fifo)
{
int descriptor;
int a=0;
int i=0;
descriptor = open(fifo, O_WRONLY);
while (i!=10)
{
a+=2;
write(descriptor,&a, sizeof(a));
printf("Even number %d : %d\n", i, a);
i++;
}
close(descriptor);
}
int main(void)
{
char * fifo = "/tmp/myfifo_file";
mkfifo(fifo, 0666);
prog1(fifo);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
void prog2(char *fifo)
{
int descriptor;
int b=1;
int i=0;
descriptor = open(fifo, O_WRONLY);
while (i!=10)
{
write(descriptor, &b, sizeof(b));
printf("Odd number %d: %d\n", i, b);
b+=2;
i++;
}
close(descriptor);
}
int main(void)
{
char * fifo = "/tmp/myfifo_file";
mkfifo(fifo, 0666);
prog2(fifo);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
void prog3(char *fifo)
{
int descriptor;
int a;
int b;
int i=0;
descriptor = open(fifo, O_RDONLY);
while (i!=10)
{
read(descriptor,&a, sizeof(a));
read(descriptor,&b, sizeof(b));
printf("Sum %d: %d + %d = %d\n", i, a, b, a+b);
i++;
}
close(descriptor);
}
int main(void)
{
char * fifo = "/tmp/myfifo_file";
mkfifo(fifo, 0666);
prog3(fifo);
return 0;
}
$ ./prog1&./prog2&
[1] 8410
[2] 8411
$ ./prog3
Sum 0: 1 + 2 = 3
Odd number 0: 1
Even number 0 : 2
Odd number 1: 3
Sum 1: 3 + 4 = 7
Even number 1 : 4
Odd number 2: 5
Sum 2: 5 + 6 = 11
Odd number 3: 7
Even number 2 : 6
Odd number 4: 9
Even number 3 : 8
Sum 3: 7 + 9 = 16
Odd number 5: 11
Even number 4 : 10
Odd number 6: 13
Sum 4: 8 + 11 = 19
Even number 5 : 12
Odd number 7: 15
Sum 5: 10 + 13 = 23
Even number 6 : 14
Odd number 8: 17
Sum 6: 12 + 15 = 27
Odd number 9: 19
Even number 7 : 16
Sum 7: 14 + 17 = 31
Even number 8 : 18
Sum 8: 16 + 19 = 35
Even number 9 : 20
Sum 9: 18 + 20 = 38
[2] + 8411 done ./prog2
[1] + 8410 done ./prog1