読んでください:Strcpyは送信中に実行されませんが、直接等式が実行されるため、文字列に正しい値を割り当てることができません
コード1:書かれているのはchar *、取り出されているのはintです
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <iostream>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
using namespace std;
#define ERR_EXIT(m) \
do{\
perror(m);\
exit(1); \
} while (0)
void sem_v(int semid)
{
struct sembuf sops = { 0,1,0 };//默认阻塞
int ret = semop(semid, &sops, 1);
if (ret == -1)
{
ERR_EXIT("sem_v");
}
}
void sem_p(int semid)
{
struct sembuf sops = { 0,-1,0 };//默认阻塞
int ret = semop(semid, &sops, 1);
if (ret == -1)
{
ERR_EXIT("sem_p");
}
}
int main()
{
//前置服务器
pid_t pid = fork();
if (pid == 0)
{
//子进程从后置服务器取出数据
int semid = semget(1234, 0, 0);// get a System V semaphore set identifier
if (semid == -1)
{
semid = semget(1234, 1, IPC_CREAT | 0666);//打开失败创建
}
int shemid = shmget(1234, 1024, 0);//allocates a System V shared memory segment
if (shemid == -1)
{
shemid = shmget(1234, 1024, IPC_CREAT | 0666);//打开失败创建
}
int* addr = (int*)shmat(shemid, NULL, 0);
//从共享内存取数据
sem_p(semid);
int p = *addr;
cout << "get value =" << p << endl;
}
//写数据进入到共享内存
int semid2 = semget(1235, 0, 0);// get a System V semaphore set identifier
if (semid2 == -1)
{
semid2 = semget(1235, 1, IPC_CREAT | 0666);//打开失败创建
}
int shemid2 = shmget(1235, 1024, 0);//allocates a System V shared memory segment
if (shemid2 == -1)
{
shemid2 = shmget(1235, 1024, IPC_CREAT | 0666);//打开失败创建
}
char* shmptr2 = (char*)shmat(shemid2, NULL, 0);
//shmptr2 = "nuhao";
strcpy(shmptr2, "nuhao");
sleep(5);
sem_v(semid2);
return 0;
}
コード2:char *を取り出し、intを書く
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <iostream>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
using namespace std;
#define ERR_EXIT(m) \
do{\
perror(m);\
exit(1); \
} while (0)
void sem_v(int semid)
{
struct sembuf sops = { 0,1,0 };//默认阻塞
int ret = semop(semid, &sops, 1);
if (ret == -1)
{
ERR_EXIT("sem_v");
}
}
void sem_p(int semid)
{
struct sembuf sops = { 0,-1,0 };//默认阻塞
int ret = semop(semid, &sops, 1);
if (ret == -1)
{
ERR_EXIT("sem_p");
}
}
int main()
{
//后置服务器
pid_t pid = fork();
if (pid == 0)
{
//子进程从前置服务器取出数据
int semid = semget(1235, 0, 0);// get a System V semaphore set identifier
if (semid == -1)
{
semid = semget(1235, 1, IPC_CREAT | 0666);//打开失败创建
}
int shemid = shmget(1235, 1024, 0);//allocates a System V shared memory segment
if (shemid == -1)
{
shemid = shmget(1235, 1024, IPC_CREAT | 0666);//打开失败创建
}
char* addr = (char*)shmat(shemid, NULL, 0);
//从共享内存取数据
sem_p(semid);
//char p = *addr;
cout << "get value =" << addr << endl;
}
//写数据发送给前置服务器
int semid2 = semget(1234, 0, 0);// get a System V semaphore set identifier
if (semid2 == -1)
{
semid2 = semget(1234, 1, IPC_CREAT | 0666);//打开失败创建
}
int shemid2 = shmget(1234, 1024, 0);//allocates a System V shared memory segment
if (shemid2 == -1)
{
shemid2 = shmget(1234, 1024, IPC_CREAT | 0666);//打开失败创建
}
int* addr2 = (int*)shmat(shemid2, NULL, 0);
*addr2 = 110;
sleep(5);
sem_v(semid2);
return 0;
}