IPC 在 parent 和 1 child 之间。
IPC between parent and 1 child.
我正在练习 parent 进程和 1 child 之间的进程通信。我想要做的是 child 发送给 parent 的每条消息都会读取它(某种阻塞发送,parent 必须在 child 继续之前先读取消息发送另一条消息)。我不能使用管道。我读过关于阻止发送的 Silberschatz 书,但我还没有找到一个很好的例子(也许邮箱也是)。你能帮忙的话,我会很高兴!
这是一段代码:
int main(int argc, char** argv) {
printf("This process: ");
printf("%d\n",getpid());
printf("Parent: ");
printf("%d\n",getppid());
pid_t f;
int input;
f = fork();
if (f == 0) {
for(int i=0;i<5;i++){
printf("Input a number: ");
scanf("%d",&input);
send(getppid(),input);
}
printf("\n");
exit(0);
} else {
recv(f,input);
printf("%d",input);
}
wait();
exit(0);
}
这是一个糟糕的 hack,但有效:/
您应该对共享内存使用信号量或某种信号。
为 ftok (createthisfile.txt) 创建文件。
这是对共享内存块进行密集轮询,并使用 "code" (int = 99) 指示 parent 表示 child for 循环已完成。请注意 99 不能用作数字,否则 parent 会过早退出。最后一点,你正在研究这个,那么你应该自己解决你的问题,获得技巧和提示,但不要让别人为你做这些工作:/否则你将主修 Whosebug,而不是计算机科学 :) 我做到了这是一个快速练习,但很遗憾 post :/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
int main(int argc, char** argv) {
key_t k;
pid_t f;
int shmid;
int input;
printf("This process: ");
printf("%d\n",getpid());
printf("Parent: ");
printf("%d\n",getppid());
k = ftok ("createthisfile.txt", 'R');
shmid = shmget(k, sizeof(int), IPC_CREAT|SHM_R|SHM_W);
char *addr = shmat(shmid,0,0);
f = fork();
if (f == -1) {
exit(1);
}
if (f == 0) {
for(int i=0;i<5;i++){
printf("Input a number: ");
scanf("%d",&input);
memcpy(addr, &input, sizeof(int));
}
input = 99;
memcpy(addr, &input, sizeof(int));
printf("\n");
exit(0);
} else {
while (1) {
memcpy(&input, addr, sizeof(int));
if (input != 0) {
if (input == 99) {
exit (0);
}
printf("[Parent reads: %d]\n",input);
input = 0;
memcpy(addr, &input, sizeof(int));
}
}
}
exit(0);
}
我正在练习 parent 进程和 1 child 之间的进程通信。我想要做的是 child 发送给 parent 的每条消息都会读取它(某种阻塞发送,parent 必须在 child 继续之前先读取消息发送另一条消息)。我不能使用管道。我读过关于阻止发送的 Silberschatz 书,但我还没有找到一个很好的例子(也许邮箱也是)。你能帮忙的话,我会很高兴! 这是一段代码:
int main(int argc, char** argv) {
printf("This process: ");
printf("%d\n",getpid());
printf("Parent: ");
printf("%d\n",getppid());
pid_t f;
int input;
f = fork();
if (f == 0) {
for(int i=0;i<5;i++){
printf("Input a number: ");
scanf("%d",&input);
send(getppid(),input);
}
printf("\n");
exit(0);
} else {
recv(f,input);
printf("%d",input);
}
wait();
exit(0);
}
这是一个糟糕的 hack,但有效:/ 您应该对共享内存使用信号量或某种信号。 为 ftok (createthisfile.txt) 创建文件。 这是对共享内存块进行密集轮询,并使用 "code" (int = 99) 指示 parent 表示 child for 循环已完成。请注意 99 不能用作数字,否则 parent 会过早退出。最后一点,你正在研究这个,那么你应该自己解决你的问题,获得技巧和提示,但不要让别人为你做这些工作:/否则你将主修 Whosebug,而不是计算机科学 :) 我做到了这是一个快速练习,但很遗憾 post :/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
int main(int argc, char** argv) {
key_t k;
pid_t f;
int shmid;
int input;
printf("This process: ");
printf("%d\n",getpid());
printf("Parent: ");
printf("%d\n",getppid());
k = ftok ("createthisfile.txt", 'R');
shmid = shmget(k, sizeof(int), IPC_CREAT|SHM_R|SHM_W);
char *addr = shmat(shmid,0,0);
f = fork();
if (f == -1) {
exit(1);
}
if (f == 0) {
for(int i=0;i<5;i++){
printf("Input a number: ");
scanf("%d",&input);
memcpy(addr, &input, sizeof(int));
}
input = 99;
memcpy(addr, &input, sizeof(int));
printf("\n");
exit(0);
} else {
while (1) {
memcpy(&input, addr, sizeof(int));
if (input != 0) {
if (input == 99) {
exit (0);
}
printf("[Parent reads: %d]\n",input);
input = 0;
memcpy(addr, &input, sizeof(int));
}
}
}
exit(0);
}