管道不发送选项卡
the pipes don"t send the tab
在我的代码中,我必须使用多个管道,父亲必须向每个儿子发送一个区间,而在这个区间中,儿子必须搜索素数。
问题是父亲发送的区间,儿子没有收到。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
int main(void)
{
const int p = 4;
const int n = 500;
int k, i, j;
int premier;
pid_t fils[p];
int tubePere[2], tubeFils[p][2], intervals1[2], intervals2[2];
pipe(tubePere);
for (k = 0; k < p; k++)
{
pipe(tubeFils[p]);
fils[k] = fork();
intervals1[0] = k * n/p + 1;
intervals1[1] = (k + 1) * n/p;
printf("intervals1 : %d .. %d\n",intervals1[0], intervals1[1]);
close(tubeFils[k][0]);
write(tubeFils[k][1], intervals1, sizeof(intervals1));
if (fils[k] == 0)
{
close(tubeFils[k][1]);
read(tubeFils[k][0], intervals2, sizeof(intervals2));
printf("intervals2 : %d .. %d\n",intervals2[0], intervals2[1]);
for (i = intervals1[0]; i <= intervals2[1]; i++)
{
if (i == 1)
premier = 0;
else if (i == 2)
premier = 1;
else
{
j = 2;
premier = 1;
while ((j <= sqrt(i)) && (premier == 1))
{
if ((i%j) == 0)
premier = 0;
j++;
}
}
if (premier == 1)
{
//printf("%d ",i);
}
}
exit(0);
}
else if (fils[k] == -1)
printf("Error\n");
}
return 0;
}
我显示了儿子收到和父亲发送的间隔
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals1 : 376 .. 500
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals1 : 376 .. 500
intervals2 : 0 .. 255
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals2 : 0 .. 255
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals2 : 0 .. 255
intervals1 : 1 .. 125
intervals2 : 0 .. 255
您正在 和 中做神父 write
,而不是 仅 中的神父。
你的第二个管道调用是 pipe(tubefils[p])
但它需要是 pipe(tubefils[k])
你应该 wait
在神父结束时做。
并且,您应该在完成写入后关闭父级管道的写入端。
并且,您应该在读取后关闭子管道的读取端。
这是一些更正后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <sys/wait.h>
int
main(void)
{
const int p = 4;
const int n = 500;
int k, i, j;
int premier;
pid_t pid;
pid_t fils[p];
int tubePere[2], tubeFils[p][2], intervals1[2], intervals2[2];
pipe(tubePere);
for (k = 0; k < p; k++) {
#if 0
pipe(tubeFils[p]);
#else
pipe(tubeFils[k]);
#endif
pid = fork();
fils[k] = pid;
if (pid < 0) {
printf("Error\n");
exit(1);
}
// pere ...
if (pid != 0) {
intervals1[0] = k * n / p + 1;
intervals1[1] = (k + 1) * n / p;
printf("intervals1 : %d .. %d\n", intervals1[0], intervals1[1]);
close(tubeFils[k][0]);
write(tubeFils[k][1], intervals1, sizeof(intervals1));
close(tubeFils[k][0]);
continue;
}
// fils ...
close(tubeFils[k][1]);
read(tubeFils[k][0], intervals2, sizeof(intervals2));
close(tubeFils[k][0]);
printf("intervals2 : %d .. %d\n", intervals2[0], intervals2[1]);
for (i = intervals1[0]; i <= intervals2[1]; i++) {
if (i == 1)
premier = 0;
else if (i == 2)
premier = 1;
else {
j = 2;
premier = 1;
while ((j <= sqrt(i)) && (premier == 1)) {
if ((i % j) == 0)
premier = 0;
j++;
}
}
if (premier == 1) {
// printf("%d ",i);
}
}
exit(0);
}
while (1) {
pid = wait(NULL);
if (pid <= 0)
break;
}
return 0;
}
这是更正后的输出:
intervals2 : 1 .. 125
intervals1 : 1 .. 125
intervals2 : 126 .. 250
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals2 : 376 .. 500
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals2 : 251 .. 375
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals1 : 376 .. 500
在我的代码中,我必须使用多个管道,父亲必须向每个儿子发送一个区间,而在这个区间中,儿子必须搜索素数。
问题是父亲发送的区间,儿子没有收到。 这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
int main(void)
{
const int p = 4;
const int n = 500;
int k, i, j;
int premier;
pid_t fils[p];
int tubePere[2], tubeFils[p][2], intervals1[2], intervals2[2];
pipe(tubePere);
for (k = 0; k < p; k++)
{
pipe(tubeFils[p]);
fils[k] = fork();
intervals1[0] = k * n/p + 1;
intervals1[1] = (k + 1) * n/p;
printf("intervals1 : %d .. %d\n",intervals1[0], intervals1[1]);
close(tubeFils[k][0]);
write(tubeFils[k][1], intervals1, sizeof(intervals1));
if (fils[k] == 0)
{
close(tubeFils[k][1]);
read(tubeFils[k][0], intervals2, sizeof(intervals2));
printf("intervals2 : %d .. %d\n",intervals2[0], intervals2[1]);
for (i = intervals1[0]; i <= intervals2[1]; i++)
{
if (i == 1)
premier = 0;
else if (i == 2)
premier = 1;
else
{
j = 2;
premier = 1;
while ((j <= sqrt(i)) && (premier == 1))
{
if ((i%j) == 0)
premier = 0;
j++;
}
}
if (premier == 1)
{
//printf("%d ",i);
}
}
exit(0);
}
else if (fils[k] == -1)
printf("Error\n");
}
return 0;
}
我显示了儿子收到和父亲发送的间隔
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals1 : 376 .. 500
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals1 : 376 .. 500
intervals2 : 0 .. 255
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals2 : 0 .. 255
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals2 : 0 .. 255
intervals1 : 1 .. 125
intervals2 : 0 .. 255
您正在 和 中做神父 write
,而不是 仅 中的神父。
你的第二个管道调用是 pipe(tubefils[p])
但它需要是 pipe(tubefils[k])
你应该 wait
在神父结束时做。
并且,您应该在完成写入后关闭父级管道的写入端。
并且,您应该在读取后关闭子管道的读取端。
这是一些更正后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <sys/wait.h>
int
main(void)
{
const int p = 4;
const int n = 500;
int k, i, j;
int premier;
pid_t pid;
pid_t fils[p];
int tubePere[2], tubeFils[p][2], intervals1[2], intervals2[2];
pipe(tubePere);
for (k = 0; k < p; k++) {
#if 0
pipe(tubeFils[p]);
#else
pipe(tubeFils[k]);
#endif
pid = fork();
fils[k] = pid;
if (pid < 0) {
printf("Error\n");
exit(1);
}
// pere ...
if (pid != 0) {
intervals1[0] = k * n / p + 1;
intervals1[1] = (k + 1) * n / p;
printf("intervals1 : %d .. %d\n", intervals1[0], intervals1[1]);
close(tubeFils[k][0]);
write(tubeFils[k][1], intervals1, sizeof(intervals1));
close(tubeFils[k][0]);
continue;
}
// fils ...
close(tubeFils[k][1]);
read(tubeFils[k][0], intervals2, sizeof(intervals2));
close(tubeFils[k][0]);
printf("intervals2 : %d .. %d\n", intervals2[0], intervals2[1]);
for (i = intervals1[0]; i <= intervals2[1]; i++) {
if (i == 1)
premier = 0;
else if (i == 2)
premier = 1;
else {
j = 2;
premier = 1;
while ((j <= sqrt(i)) && (premier == 1)) {
if ((i % j) == 0)
premier = 0;
j++;
}
}
if (premier == 1) {
// printf("%d ",i);
}
}
exit(0);
}
while (1) {
pid = wait(NULL);
if (pid <= 0)
break;
}
return 0;
}
这是更正后的输出:
intervals2 : 1 .. 125
intervals1 : 1 .. 125
intervals2 : 126 .. 250
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals2 : 376 .. 500
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals2 : 251 .. 375
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals1 : 376 .. 500