【发布时间】:2012-10-24 19:21:16
【问题描述】:
我一周前开始了解和使用信号量和共享内存,并实际创建了这个程序,问题是我找不到任何问题我一直在看它几个小时,一切似乎都是正确的。代码编译和我可以创建构建,但是当我执行它时没有任何反应......
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <sys/fcntl.h>
#include <semaphore.h>
#define MAXCHILDS 4
#define MAX_SIZE 10
#define MAX_WRITES 4
typedef struct{
int m[MAX_SIZE][MAX_SIZE];
} matrix;
/*fork variables*/
pid_t child[MAXCHILDS];
/*semphores variables */
sem_t *empty, *full, * mutex;
/*share memory id*/
int shmid;
/*shared memory array pointer */
matrix * sh_mem;
/*pointer to matrix*/
int **p;
void init(){
/*create pointer to matrix*/
p = &sh_mem->m;
/*semaphores unlink and creation */
sem_unlink("EMPTY");
empty=sem_open("EMPTY",O_CREAT|O_EXCL,0700,MAX_WRITES);
sem_unlink("FULL");
full=sem_open("FULL",O_CREAT|O_EXCL,0700,0);
sem_unlink("MUTEX");
mutex=sem_open("MUTEX",O_CREAT|O_EXCL,0700,1);
/*initialize shared memory */
shmid = shmget(IPC_PRIVATE,sizeof(matrix),IPC_CREAT|0777);
/*map shared memory*/
sh_mem = (matrix*)shmat(shmid,NULL,0);
if(sh_mem== (matrix*)(-1)){
perror("shmat");
}
}
void writer(int ** m){
int i,k;
for(i = 0;i<MAX_SIZE;i++){
for(k= 0;k<MAX_SIZE;k++){
m[i][k] = 0;
}
}
}
void reader(int **m){
int i = 0;
int k = 0;
for(i = 0;i<MAX_SIZE;i++){
for(k= 0;k<MAX_SIZE;k++){
printf(m[i][k]);
}
printf("\n");
}
}
void terminate() {
sem_close(empty);
sem_close(full);
sem_close(mutex);
sem_unlink("EMPTY");
sem_unlink("FULL");
sem_unlink("MUTEX");
shmctl(shmid, IPC_RMID, NULL);
}
int main(int argc, char **argv)
{
int i;
init();
for(i = 0;i<MAXCHILDS;i++){
if((child[i]= fork()) < 0) // error occured
{
perror("Fork Failed");
exit(1);
}
if((child[i] =fork())==0){
writer(p);
exit(0);
}
}
/*father*/
reader(p);
wait(NULL);
terminate();
return 0;
}
孩子应该在共享内存中写入矩阵,父亲应该读取共享内存数组并打印矩阵。 你能帮我解决这个问题吗?感谢您的帮助...
【问题讨论】:
-
第一个奇怪的是你在循环中调用了两次
fork并将结果分配给一个变量。我很确定您只想调用一次并将结果保存在变量中并使用 that 两次。 -
副手,我可以看到你的
main()函数看起来有点像fork bomb,因为进程分叉并且父子进程再次执行 for 循环。除此之外,我认为如果您说出程序应该做什么而不是仅仅说它什么都不做,这可能会有所帮助。 -
@Celada:不,我猜只创建了 3 *
MAXCHILDS。这不是真正的分叉炸弹 ;-) -
感谢您这么快回答,孩子们应该写入共享内存中的矩阵,而父亲应该从中读取。
-
是的,现在我只需要一个孩子,但在我解决了这个问题后,我想为孩子们划分矩阵......如果你能帮我找出为什么这不起作用......它应该打印父亲从共享内存中读取的矩阵。
标签: c unix shared-memory semaphore