我有一个简单的程序,但是当我想检查从孩子那里得到的值时,它将返回1995694080或类似的数字。我有点困惑,如何获得味精的真实价值?好像我从我不应该从其他地方得到一些随机垃圾值。我根据教程制作了此管道发送器,并且大多数情况下,当我从失败的孩子发回数据时,它就可以正常工作。有任何想法或建议吗?
int pipefd[2];
int main()
{
signal(SIGTERM, handler);
signal(SIGUSR1, finishedOrder);
pid_t pid;
if (pipe(pipefd) == -1)
{
perror("Error while making pipe.\n");
exit(1);
}
pid = fork();
if (pid < 0)
{
perror("Fork error.\n");
exit(1);
}
if (pid > 0)
{
employer(pid, 4, false);
}
else
{
employee(getppid());
}
}
void employer(pid_t pid, int id, bool two)
{
int rec;
printf("[Szülő]: várok egy szerelő csapatra! \n");
sleep(1);
kill(pid, SIGTERM);
pause();
if (two)
{
/.../
}
else
{
printf("[Szülő]: dolgozz a %d. feladaton\n", id);
close(pipefd[0]);
write(pipefd[1], &id, sizeof(id)); //this is works.
close(pipefd[1]);
sleep(1);
kill(pid, SIGTERM);
pause();
kill(pid, SIGTERM);
}
pause();
close(pipefd[1]);
read(pipefd[0], &rec, sizeof(rec));
printf("%d\n", rec); // here I get the strange value
if (rec == 4)
{
printf("[Szülő]: feljegyeztem a módosításokat.\n");
if (two)
{
/**/
}
else
{
/**/
}
}
}
void employee(pid_t emp)
{
int jobs[2];
pause();
printf("[Gyerek]: munkára jelentkezek\n");
sleep(1);
kill(emp, SIGTERM);
pause();
close(pipefd[1]);
read(pipefd[0], &jobs[0], sizeof(jobs[0]));
close(pipefd[0]);
printf("[Gyerek]: elkezdek dolgozni a %d. feladaton.\n", jobs[0]);
sleep(1);
kill(emp, SIGUSR1);
pause();
sleep(1);
read(pipefd[0], &jobs[1], sizeof(jobs[1]));
if (jobs[1] != 0)
{
printf("[Gyerek]: elkezdek dolgozni a %d. feladaton.\n", jobs[1]);
sleep(1);
kill(emp, SIGUSR1);
}
close(pipefd[0]);
fflush(NULL);
int msg = 4;
printf("%d\n", msg);
write(pipefd[1], &msg, sizeof(msg));
close(pipefd[1]);
sleep(1);
kill(emp, SIGTERM);
}
void handler(int signum)
{
}
void finishedOrder()
{
}
答案 0 :(得分:4)
read(pipefd[0], &rec, sizeof(rec));
您无需检查read
返回的值即可查看已收到多少数据。如果这样做了,您可能会发现这不是您期望的,因为在代码的前面您已经做到了……
close(pipefd[0]);
关闭文件描述符后,您将无法读取它。更重要的是,您创建的“管道”不是双向的。如果要发送和接收,则需要对pipe
进行两次调用以获取两对文件描述符。
鉴于您还close(pipefd[1])
之前做过read
,这意味着您已经封闭了管道的两端,这似乎是您误解了close
的目的在这种情况下。子项close
和父项keras.activations.softmax
不在使用中,仅此而已。它并不表示有关谁正在读取或写入管道的任何信息。
答案 1 :(得分:1)
在您的print(' , '.join(x))
print(*x)
output:
jasmine, amine
jasmine amine
函数中,您使用employer()
关闭管道的读取端,然后稍后尝试使用close(pipefd[0]);
对其进行读取
试图从封闭的fd中读取可能会导致产生奇怪的值。会像Johnathan Leffler所说的那样做。
rustyx在注释中是正确的-检查read(pipefd[0], &rec, sizeof(rec));
的返回值是个好主意,因为它会发现这种错误。