gpt4 book ai didi

c - 命名管道乒乓同步进程

转载 作者:行者123 更新时间:2023-11-30 17:32:16 25 4
gpt4 key购买 nike

我必须将 2 个进程与命名管道同步。父亲必须打印 n 次“Ping”,然后将“C”发送给儿子,然后打印“Pong”。在“ping”后,父亲发送“Q”,儿子打印最后一个“Pong”并离开并终止自己。它可以工作,但有时最后一个乒乓球没有打印出来。

void pingpong(int n)
{
char buffer;
pid_t pid;
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP;
int descEcriture, descLecture;
if ( mkfifo(("père"), mode) < 0 ){
perror("mkfifo");
}
if ( mkfifo(("fils"), mode) < 0 ){
perror("mkfifo");
}
if ((pid = fork()) < 0){
perror("fork");
exit(-1);
}
if(pid == 0){
while(1){


if((descEcriture = open("père", O_WRONLY)) < 0){
perror("père Tube");
exit(-1);
}
if(n == 0){
write(descEcriture, "Q", 1);
break;
}
write(STDOUT_FILENO, "Ping", strlen("Ping")+1);
write(descEcriture, "C", 1);
close(descEcriture);
if((descLecture = open("fils", O_RDONLY))<0){
perror("père Tube");
exit(-1);
}
read(descLecture, &buffer, 1);
close(descLecture);
n--;
}
exit(0);
}
else
{
while(1){
if((descLecture = open("père", O_RDONLY)) < 0){
perror("pere Tube");
exit(-1);
}
read(descLecture, &buffer, 1);
if (buffer == 'C')
{
write(STDOUT_FILENO, "Pong", strlen("Pong")+1);
}
if (buffer=='Q')
{
break;
}
if((descEcriture = open("fils", O_WRONLY)) < 0){
perror("fils Tube");
exit(-1);
}
write(descEcriture, "K", 1);
}
unlink("père"); unlink("fils");
exit(0);
}

}

最佳答案

没有理由在每次循环迭代时打开和关闭管道。尝试在循环之前打开管道并在循环之后关闭它们。

此外,您将在字符串“ping”和“pong”之后打印空字节,因为您要将 1 添加到 strlen 的返回值中。尝试这样的事情:

// Near top of program:
#define PING "ping"
#define PONG " : pong\n"

// In pingpong function:
// In parent:
write(STDOUT_FILENO, PING, strlen(PING));
// In child:
write(STDOUT_FILENO, PONG, strlen(PONG));

而且你似乎把 parent 和 child 搞混了。如果 pid 为 0,则它是子进程,而不是父进程。

关于c - 命名管道乒乓同步进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24287966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com