- 论坛徽章:
- 0
|
共享内存不能创建,请问什么原因?
key=ftok(" /" , 0);
shmid=shmget(key,SEGSIZE,IPC_CREAT|0604);
if(shmid ==- 1){
printf(" create shared momery error\n" );
return- 1;
}
shm=(char* )shmat(shmid,0,0);
key=ftok(" /" , 0);
shmid=shmget(key,SEGSIZE,0);
if(shmid ==- 1){
printf(" get shared momery error\n" );
return- 1;
}
shm=(char* )shmat(shmid,0,0);
================================================
/***** testwrite.c *******/
#include <sys/ipc.h>;
#include <sys/shm.h>;
#include <sys/types.h>;
#include <unistd.h>;
typedef struct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
char temp;
people *p_map;
char* name = "/dev/shm/myshm2";
key = ftok(name,0);
if(key==-1)
perror("ftok error" ;
shm_id=shmget(key,4096,IPC_CREAT);
if(shm_id==-1)
{
perror("shmget error" ;
return;
}
p_map=(people*)shmat(shm_id,NULL,0);
temp='a';
for(i = 0;i<10;i++)
{
temp+=1;
memcpy((*(p_map+i)).name,&temp,1);
(*(p_map+i)).age=20+i;
}
if(shmdt(p_map)==-1)
perror(" detach error " ;
}
/********** testread.c ************/
#include <sys/ipc.h>;
#include <sys/shm.h>;
#include <sys/types.h>;
#include <unistd.h>;
typedef struct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
people *p_map;
char* name = "/dev/shm/myshm2";
key = ftok(name,0);
if(key == -1)
perror("ftok error" ;
shm_id = shmget(key,4096,IPC_CREAT);
if(shm_id == -1)
{
perror("shmget error" ;
return;
}
p_map = (people*)shmat(shm_id,NULL,0);
for(i = 0;i<10;i++)
{
printf( "name:%s\n",(*(p_map+i)).name );
printf( "age %d\n",(*(p_map+i)).age );
}
if(shmdt(p_map) == -1)
perror(" detach error " ;
}
testwrite.c创建一个系统V共享内存区,并在其中写入格式化数据;testread.c访问同一个系统V共享内存区,读出其中的格式化数据。分别把两个程序编译为testwrite及testread,先后执行./testwrite及./testread 则./testread输出结果如下:
name: b age 20; name: c age 21; name: d age 22; name: e age 23; name: f age 24;
name: g age 25; name: h age 26; name: I age 27; name: j age 28; name: k age 29;
========================================================
有一种方法就是采用SUN公司自带的光盘采取引导,建议采取这种方法:
1. boot cdrom -s
2. fsck /dev/dsk/c0t0d0s0 (取决于根分区的设备)
3. mount -F ufs /dev/dsk/c0t0d0s0 /mnt
4. TERM=ansi; export TERM
5. 编辑/mnt/etc shadow文件,把root对应的口令去掉。
6. 重启后的root的口令为空。 |
|