Linux中为什么sem_open返回0,我可以在下面的程序中使用sem_open,但是我在这里看到崩溃?...
我正在為共享內存上的學生制作一個教程。不過,我在等待或發布信號時看到崩潰。我正在使用sem_open API來初始化信號量。在做sem_open之前我需要分配一些內存嗎?它在我看來是一個分段錯誤。你能幫我嗎?我可以在下面的程序中使用sem_open,但是我在這里看到崩潰?
#include
#include
#include
#include
#include
/** page size **/
#include
/** memcpy **/
#include
#include
#include
using namespace std;
class READER_WRITER_A
{
private:
string msg;
void *shm_ptr;
int shm_id;
sem_t *sem_rw;
void Init_Shm();
void Init_Sem();
public:
void Read_Msg();
void Write_Msg(string s1);
READER_WRITER_A();
};
void READER_WRITER_A::Init_Shm()
{
key_t key;
key = ftok("/home/joshis1/Downloads/IPC-BLOG/shm",1);
shm_id = shmget(key, getpagesize(), IPC_CREAT| 0660);
shm_ptr = shmat(shm_id, NULL, 0660);
}
void READER_WRITER_A::Init_Sem()
{
sem_rw = sem_open("/home/joshis1/Downloads/IPC-BLOG/rw_sem", O_RDWR | O_CREAT, 0666, 0);
cout<
if(sem_rw < 0)
cout<
sem_post(sem_rw);
cout<
}
void READER_WRITER_A::Read_Msg()
{
//sem_wait(sem_rw);
int *size = (int *)shm_ptr;
void *msg_ptr = shm_ptr;
msg_ptr+=sizeof(int);
cout<
memcpy(&msg,(string *)msg_ptr,*size);
cout<
//sem_post(sem_rw);
}
void READER_WRITER_A::Write_Msg(string s1)
{
//sem_wait(sem_rw);
void *msg_ptr = shm_ptr;
msg = s1;
int *pt = (int*)shm_ptr;
*pt = s1.size();
cout<
msg_ptr+=sizeof(int);
cout<
memcpy((string *)msg_ptr,&msg,s1.size());
//sem_post(sem_rw);
}
READER_WRITER_A::READER_WRITER_A()
{
Init_Shm();
Init_Sem();
}
int main(int argc, char *argv[])
{
READER_WRITER_A val;
val.Write_Msg("I am A-RW");
val.Read_Msg();
return 0;
}
這是輸出。
$ ./reader_writer_a.out
Sem_Post calling
Segmentation fault (core dumped)
這里分析coredump。
(gdb) bt
#0 0x0000003fb060d790 in sem_post() from /lib64/libpthread.so.0
#1 0x0000000000400fd0 in READER_WRITER_A::Init_Sem (this=0x7fff50e322a0) at reader_writer_a.cpp:52
#2 0x0000000000401199 in READER_WRITER_A::READER_WRITER_A (this=0x7fff50e322a0) at reader_writer_a.cpp:86
#3 0x00000000004011d8 in main (argc=1, argv=0x7fff50e323c8) at reader_writer_a.cpp:92
總結
以上是生活随笔為你收集整理的Linux中为什么sem_open返回0,我可以在下面的程序中使用sem_open,但是我在这里看到崩溃?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 财务报表查询
- 下一篇: JavaScript函数简介