我正在尝试理解fork,mkfifo和select。
我分叉N个孩子,每个孩子将他的ID写入管道,父母从管道中读取ID。
int myPipe = mkfifo("pipe", S_IRUSR | S_IWUSR);
if (myPipe < 0)
perror("mkfifo: ");
int n = 3;
pid_t* pids = malloc(n * sizeof(pid_t));
int i;
for (i = 0; i < n; ++i)
{
pids[i] = fork();
if (pids[i] < 0)
perror("Fork: ");
}
fd_set fdMyPipe;
FD_ZERO(&fdMyPipe);
FD_SET(myPipe, &fdMyPipe);
for (i = 0; i < n; ++i)
{
if (pids[i] == 0) //child
{
printf("Child[%d] : I write my ID to the pipe.\n", i);
write(myPipe, &i, sizeof(i));
}
else //parent
{
int j;
for (j = 0; j < n; ++j)
{
int r = select(myPipe + 1, &fdMyPipe, NULL, NULL, NULL);
if (FD_ISSET(myPipe, &fdMyPipe))
{
int child;
read(myPipe, &child, sizeof(&child));
printf("Parent : Child[%d]'s ID is %d.\n", child, child);
}
}
}
}
输出如下:
Child[0] : I write my ID to the pipe.
Child[0] : I write my ID to the pipe.
Child[0] : I write my ID to the pipe.
Child[1] : I write my ID to the pipe.
Child[0] : I write my ID to the pipe.
Child[1] : I write my ID to the pipe.
Child[2] : I write my ID to the pipe.
我无法理解为什么有4个零,2个以及它们混淆的原因。
此外,当我多次点击输入时,我会得到以下信息:
父母:孩子[10]的身份证是10。
父母:孩子[10]的身份证是10。
父母:孩子[10]的身份证是10。
为什么ID为10,为什么它总是十?
修改
现在我得到正确的孩子数量/顺序。
for (i = 0; i < n; ++i)
{
pids[i] = fork();
if (pids[i] < 0)
perror("Fork: ");
if (pids[i] == 0) //child
{
printf("Child[%d] : I write my ID to the pipe.\n", i);
write(myPipe, &i, sizeof(i));
return;
}
else //parent
{
int j;
for (j = 0; j < n; ++j)
{
int r = select(myPipe + 1, &fdMyPipe, NULL, NULL, NULL);
if (FD_ISSET(myPipe, &fdMyPipe))
{
int child;
read(myPipe, &child, sizeof(child));
printf("Parent : Child[%d]'s ID is %d.\n", child, child);
}
}
}
}
但是,父母仍然会读取一些随机ID。
父母:孩子[1426203146]的身份证号码是1426203146。
父母:孩子[1426203146]的身份证号码是1426203146。