本人在练习时遇到如下警告
在函数‘main’中
警告 赋值时将指针赋给整数,未作类型转换 [默认启用]
警告 赋值时将指针赋给整数,未作类型转换 [默认启用]
代码如下
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SZ 1024 /* 共享内存的大小 */
#define TIME_OUT 2
int main(int argc, char **argv)
{
int shmid;
key_t key;
pid_t pid;
int psm;
struct shmid_ds dsbuf;
if(argc != 2) /* 检查命令行参数个数是否正确 */
{
printf("arguments error.\n");
exit(1);
}
key = ftok("/home/by-402", 'b'); /* 生成共享内存的键值 */
if(key < 0) /* 如果ftok函数调用失败,输出错误信息并退出*/
{
perror("ftok error");
exit(1) ;
}
shmid = shmget(key, SHM_SZ, IPC_CREAT | 0666); /* 创建一块共享内存 */
if(shmid < 0) /* 如果共享内存创建失败,输出错误信息并退出 */
{
perror("shmget error");
exit(1) ;
}
pid = fork(); /* 创建子进程 */
if(pid<0) /* 如果进程创建失败,输出错误信息并退出 */
{
printf("fork error.\n");
exit(1);
}
if(pid==0) /* 子进程,向共享内存中写入数据 */
{
printf("Child process:\n");
printf("PID : %d\n", getpid()); /* 输出子进程的标志符 */
psm = shmat(shmid, NULL, 0); /* aflect将共享内存映射到进程的地址空间中 */
if(psm == -1) /* 如果映射失败,输出错误信息并退出 */
{
perror("shmat error\n");
exit(1);
}
else /* 共享内存映射成功 */
{
strcpy((char *)psm, argv[1]); /* 向共享内存中写入数据,这里传入为命令行参数*/
printf("Send message : %s\n", (char *)psm);
if((shmdt((void *)psm)) < 0) /* deflect使共享内存脱离进程的地址空间*/
perror("shmdt error\n");
sleep(TIME_OUT);
}
}
else /* 父进程,从共享内存中读取数据 */
{
sleep(TIME_OUT);
printf("Parent process:\n");
printf("PID : %d\n", getpid()); /* 输出父进程的标志符 */
if((shmctl(shmid, IPC_STAT, &dsbuf)) < 0) /* 获取共享内存的状态信息*/
{
perror("shmctl error\n");
exit(1);
}
else /* 共享内存的状态信息获取成功 */
{
printf("Shared Memory Information:\n");
printf("\tCreator PID: %d\n", dsbuf.shm_cpid); /* 输出创建共享内存进程的标识符 */
printf("\tSize(bytes): %d\n",dsbuf.shm_segsz); /* 输出共享内存的大小 */
printf("\tLast Operator PID: %d\n",dsbuf.shm_lpid);
/* 输出上一次操作共享内存进程的标识符 */
psm = shmat(shmid, NULL, 0); /* 将共享内存映射到进程的地址空间中 */
if(psm == -1) /* 如果映射失败,输出错误信息并退出 */
{
perror("shmat error\n");
exit(1);
}
else /* 共享内存映射成功 */
{
printf("Received message : %s\n", (char *)psm); /* 从共享内存中读取数据 */
if(shmdt((void *)psm) < 0) /* 使共享内存脱离进程的地址空间 */
perror("shmdt error\n");
}
}
if(shmctl(shmid, IPC_RMID, NULL) < 0) /* 删除前面创建的共享内存 */
{
perror("shmctl error\n");
exit(1);
}
}
return 0;
}
找不出问题在哪,希望有人能解答!