日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux中为什么sem_open返回0,我可以在下面的程序中使用sem_open,但是我在这里看到崩溃?...

發(fā)布時(shí)間:2024/3/24 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux中为什么sem_open返回0,我可以在下面的程序中使用sem_open,但是我在这里看到崩溃?... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我正在為共享內(nèi)存上的學(xué)生制作一個(gè)教程。不過,我在等待或發(fā)布信號時(shí)看到崩潰。我正在使用sem_open API來初始化信號量。在做sem_open之前我需要分配一些內(nèi)存嗎?它在我看來是一個(gè)分段錯(cuò)誤。你能幫我嗎?我可以在下面的程序中使用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

總結(jié)

以上是生活随笔為你收集整理的Linux中为什么sem_open返回0,我可以在下面的程序中使用sem_open,但是我在这里看到崩溃?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。