这是我服务器的代码:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/fcntl.h>
#define FIFONAME "fifo_clientTOserver"
#define SHM_SIZE 1024 /* make it a 1K shared memory segment */
int main(int argc, char *argv[])
{
// create a FIFO named pipe - only if it's not already exists
if(mkfifo(FIFONAME , 0666) < 0)
{
printf("Unable to create a fifo");
exit(-1);
}
/* make the key: */
key_t key;
if ((key = ftok("shmdemo.c", 'j')) == -1) {
perror("ftok");
exit(1);
}
else /* This is not needed, just for success message*/
{
printf("ftok success\n");
}
// create the shared memory
int shmid = shmget(key, sizeof(int), S_IRUSR | S_IWUSR | IPC_CREAT);
if ( 0 > shmid )
{
perror("shmget"); /*Displays the error message*/
}
else /* This is not needed, just for success message*/
{
printf("shmget success!\n");
}
// pointer to the shared memory
char *data = shmat(shmid, NULL, 0);
/* attach to the segment to get a pointer to it: */
if (data == (char *)(-1))
{
perror("shmat");
exit(1);
}
/**
* How to signal to a process :
* kill(pid, SIGUSR1);
*/
return 0;
}
我的服务器需要从共享内存段读取进程ID(类型pid_t
)。
如何从共享内存段读取某些客户端编写的数据?
答案 0 :(得分:2)
我实际上建议您使用Posix共享内存,请参阅shm_overview(7)而不是旧的(几乎已过时)System V共享内存。
如果您想坚持shmget
(即旧的System V IPC,请参阅svipc(7) ..),您需要致电shmat(2)
因此,您可能希望在成功data
电话后访问shmat
。你确实有一些关于data
的类型和大小的约定。你cpuld在某个标题中定义了struct my_shared_data_st
(由客户端和服务器使用),然后你投射(struct my_shared_data_st*)data
来访问它。
在服务器和客户端进程中都需要shmget
和shmat
。
使用共享内存,您需要某种方式在客户端和服务器之间进行同步(即告诉消费者部分生产者方已完成生成该数据)。
阅读advanced linux programming并阅读手册页数次。