簡體   English   中英

寫入共享內存分段錯誤

[英]write to shared memory segmentation fault

我要做的只是在共享內存中寫“嘿”,但是它被扔到那一行。 很簡單的代碼如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
#define FLAGS IPC_CREAT | 0644
int main(){
    key_t key;
    int shmid;
    if ((key = ftok("ex31.c", 'k')) == -1){ 
        exit(1);}        
    if ((shmid = shmget(key, SHM_SIZE, FLAGS)) == -1) {
            exit(1);}
    char* shmaddr;
    if( shmaddr=shmat(shmid,0,0) == (char*)-1){   //WRONG ARGUMENTS ??
            exit(0); }
    printf("opened shared memory\n");  //gets here
    strcpy(shmaddr, "hey");     //GETS THROWN HERE
    printf("after writing to memory\n"); //never get here

調試器給我的錯誤是:

程序收到信號SIGSEGV,分段故障。 ../ex31.c:449 449 strcpy(shmaddr,“ hey”)中的main(argc = 1,argv = 0x7fffffffe068)中的0x0000000000401966; //在這里扔

問題是運算符優先級。 在行中

shmaddr=shmat(shmid,0,0) == (char*)-1)

然后,一元-運營商和投運營商具有最高優先級,其次是== ,其次=具有最低的優先級。 所以你的代碼等於

shmaddr=(shmat(shmid,0,0) == (char*)-1))

廢話

內部條件分配是非常不好的編程習慣 如果嘗試的話,每個不雅的編譯器都會給您警告。 除了運算符優先級問題外,還很容易混淆=和==。 同樣,=運算符會給表達式帶來副作用,因此將其與其他運算符混合可能會導致不確定的行為。 也許最重要的是,將=放入內部條件通常會大大降低代碼的可讀性。

您的代碼應寫為:

shmaddr = shmat(shmid,0,0);
if(chmaddr  == (char*)-1){

重要的是要理解,將這兩行合並為1 不會獲得任何收益。生成的機器代碼將是相同的,除了上述版本中沒有錯誤外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM