// 管道是单向通信的。所以当需要在两个进程之间通信的时,需要一个关闭读端也就是p[0], // 一个关闭写端也就是p[1] int p_parent_to_child[2]; int p_child_to_parent[2]; pipe(p_parent_to_child); pipe(p_child_to_parent);
int nums[N]; for (int i = 0; i < N; i++) { nums[i] = i; } while (true) { int p[2]; pipe(p); int pid = fork(); if (pid > 0) { // 父进程往管道里面写数据 close(p[0]); int writebuf[N]; int cnt = 0; for (int i = 2; i <= 35; i++) { if (nums[i] != 0) { writebuf[cnt++] = i; write(p[1], &writebuf[cnt - 1], sizeof writebuf[cnt - 1]); } } close(p[1]); wait(0); exit(0); } else { // 子进程从管道里面读数据 close(p[1]); int prime = 0; if (read(p[0], &prime, sizeof prime) == 0) { exit(0); } printf("prime %d\n", prime); for (int i = prime; i <= 35; i += prime) { nums[i] = 0; } close(p[0]); } }
exit(0);
}
find (moderate)
info
The C library function void memmove(void str1, const void
*str2, size_t n) copies n characters from str2 to str1, but for
overlapping memory blocks, memmove() is a safer approach than memcpy().