我会按照我的理解尽力提出这个问题。
我正在进行一项编程任务(让我们现在解决这个问题)在Unix服务器上使用C或C ++来分叉四个子节点并使用信号量和共享内存来更新全局变量。我不确定我还有问题,但是我缺乏理解让我质疑我的结构。这是:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define NUM_REPEATS 10
#define SEM_KEY 1111
#define SHM_KEY 2222
int globalCounter = 0;
/***** Test function for confriming a process type ******/
int checkProcessType(const char *whoami)
{
printf("I am a %s. My pid is:%d my ppid is %d\n",
whoami, getpid(), getppid() );
for(int i = 1; i<=3; i++){
printf("%s counting %d\n", whoami, i);
}
return 1;
}
void
int main (void) {
pid_t process_id; // PID (child or zero)
int sharedMemID; // Shared memory ID
int sharedMemSize; // shared memory size
struct my_mem * sharedMemPointer; // pointer to the attached shared memory
// Definition of shared memory //
struct my_mem {
long counter;
int parent;
int child;
};
// Gathering size of shared memory in bytes //
sharedMemSize = sizeof(my_mem);
if(sharedMemSize <= 0){
perror("error collection shared memory size: Exiting...\n");
exit(0);
}
// Creating Shared Memory //
sharedMemID = shmget(SHM_KEY, sharedMemSize, 0666 | IPC_CREAT);
if (sharedMemID < 0) {
perror("Creating shared memory has failed: Exiting...");
exit(0);
}
// Attaching Shared Memory //
sharedMemPointer = (struct my_mem *)shmat(sharedMemID, NULL, 0);
if (sharedMemPointer == (struct my_mem*) -1) {
perror("Attaching shared memory has failed. Exiting...\n");
exit(0);
}
// Initializing Shared Memory //
sharedMemPointer->counter = 0;
sharedMemPointer->parent = 0;
sharedMemPointer->child = 0;
pid_t adder, reader1, reader2, reader3;
adder = fork();
if(adder > 0)
{
// In parent
reader1 = fork();
if(reader1 > 0)
{
// In parent
reader2 = fork();
if(reader2 > 0)
{
//In parent
reader3 = fork();
if (reader3 > 0)
{
//In parent
}
else if (reader3 < 0)
{
// Error
perror("fork() error");
}
else
{
// In reader3
}
}
else if(reader2 < 0)
{
//Error
perror("fork() error");
}
else
{
// In reader2
}
}
else if(reader1 < 0)
{
// Error
perror("fork() error");
}
else
{
// In reader1
}
}
else if(adder < 0 )
{
// Error
perror("fork() error");
}
else
{
// In adder
//LOOP here for global var in critical section
}
}
只是我正在做的一些信息(我认为),我创建了一个包含变量的共享内存块,让我们称之为counter
,它将严格由adder
以及在所有子进程处于活动状态后成为减法器的父级。我还在试图找出我将使用的信号量,因此加法器和减法器在关键部分执行,但我的主要问题是这个。
我怎么知道我在这个结构中的位置?我的加法器应该有一个可以完成某项工作的循环(更新全局变量),并且父/减法器应该有一个循环用于其作业(也更新全局变量)。所有readers
都可以随时查看。父/减法器的循环放置是否重要?我基本上有3个位置,我知道我会在父母身边。但是因为所有的孩子都需要先创建,所以必须在我的第三个叉子之后的最后一个条件中,我知道我在父母身边吗?当我使用我的测试方法时,我得到分散的输出,这意味着一个孩子可以在父母的输出之后,然后是三个孩子,等等。它从不以任何顺序,并且从我对叉子的理解来看,#39 ; s预期。
我真的有三个问题正在进行,但我需要首先围绕结构。所以,让我再次简洁地再次说明这一点,没有任何垃圾,因为我已经挂断了循环和关键部分的位置,甚至还没有写入。
更直接的是,父母什么时候知道所有孩子的存在,并且通过这种结构可以让一个孩子完成任务并以某种方式回到它(即加法器/第一个孩子一次添加到全局变量,退出,其他一些孩子可以做它的事情等。)
我仍然觉得我没有问正确的事情,我相信这是因为仍然试图掌握概念。希望我的口吃能够显示出我在概念上所困扰的东西。如果没有,我可以澄清。