C编程双向通信
C programming bi directional communication
我想在这里做点什么,我有一个 c 程序,我的 parent 进程创建了一个管道,这样他就可以侦听来自 children 进程的请求。这些 children 是动态创建的,永远不会相同。到目前为止,我设法通过管道将请求发送到 parent,并通过互斥锁将其同步。
我的问题是,此请求需要向提出此类请求的 child 提供答案,我不能使用同一管道,因为它是一种方式,而其他方式都是 child ren 将使用它(我已经尝试过并且它产生了一个严重的问题)
我尝试的下一件事是在 child 上的请求之前创建一个管道,并在请求中传递描述符的值。也失败了,因为 parent 不知道那些描述符,这是我在失败后发现的。
所以现在我不知道如何使请求响应达到 child...
我是C编程的初学者,欢迎大家的帮助!
顺便说一句:在 Unix 程序中工作,纯 C 编程
管道是单向的,使用套接字对于 ipc 来说似乎很痛苦。
我推荐你使用socketpair()
。您可以将它们视为双向管道。
这是一个示例,其中父级向其 child.Then 子级发送一个字符,将其变为大写并将其发送回父级。(来自 beej 的教程)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
int main(void)
{
int sv[2]; /* the pair of socket descriptors */
char buf; /* for data exchange between processes */
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) {
perror("socketpair");
exit(1);
}
if (!fork()) { /* child */
read(sv[1], &buf, 1);
printf("child: read '%c'\n", buf);
buf = toupper(buf); /* make it uppercase */
write(sv[1], &buf, 1);
printf("child: sent '%c'\n", buf);
} else { /* parent */
write(sv[0], "b", 1);
printf("parent: sent 'b'\n");
read(sv[0], &buf, 1);
printf("parent: read '%c'\n", buf);
wait(NULL); /* wait for child to die */
}
return 0;
}
你也可以很容易地使用两个管道来表示你的两个方向。
我想在这里做点什么,我有一个 c 程序,我的 parent 进程创建了一个管道,这样他就可以侦听来自 children 进程的请求。这些 children 是动态创建的,永远不会相同。到目前为止,我设法通过管道将请求发送到 parent,并通过互斥锁将其同步。
我的问题是,此请求需要向提出此类请求的 child 提供答案,我不能使用同一管道,因为它是一种方式,而其他方式都是 child ren 将使用它(我已经尝试过并且它产生了一个严重的问题)
我尝试的下一件事是在 child 上的请求之前创建一个管道,并在请求中传递描述符的值。也失败了,因为 parent 不知道那些描述符,这是我在失败后发现的。
所以现在我不知道如何使请求响应达到 child... 我是C编程的初学者,欢迎大家的帮助!
顺便说一句:在 Unix 程序中工作,纯 C 编程
管道是单向的,使用套接字对于 ipc 来说似乎很痛苦。
我推荐你使用socketpair()
。您可以将它们视为双向管道。
这是一个示例,其中父级向其 child.Then 子级发送一个字符,将其变为大写并将其发送回父级。(来自 beej 的教程)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
int main(void)
{
int sv[2]; /* the pair of socket descriptors */
char buf; /* for data exchange between processes */
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) {
perror("socketpair");
exit(1);
}
if (!fork()) { /* child */
read(sv[1], &buf, 1);
printf("child: read '%c'\n", buf);
buf = toupper(buf); /* make it uppercase */
write(sv[1], &buf, 1);
printf("child: sent '%c'\n", buf);
} else { /* parent */
write(sv[0], "b", 1);
printf("parent: sent 'b'\n");
read(sv[0], &buf, 1);
printf("parent: read '%c'\n", buf);
wait(NULL); /* wait for child to die */
}
return 0;
}
你也可以很容易地使用两个管道来表示你的两个方向。