linux显示shm segment信息一例

6 篇文章 0 订阅
#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main(void)
{
 int segment_id;
 char* shared_memory;
 const int size = 4096;
 unsigned short mode;
 struct shmid_ds shmbuffer;
 segment_id = shmget(IPC_PRIVATE, size, S_IRUSR|S_IWUSR);
 shared_memory = (char*)shmat(segment_id, NULL, 0);
 sprintf(shared_memory, "shared memory");
 printf("%s\n", shared_memory);
 if (shmctl(segment_id, IPC_STAT, &shmbuffer) == - 1)
 {
  fprintf(stderr, "Unable to access segment %d\n", segment_id);
  return -1;
 }
 printf("ID \t\t KEY \t MODE \t\t OWNER \t SIZE \t ATTTACHES \n");
 printf("-- \t\t --- \t ---- \t\t ----- \t ---- \t --------- \n");
 printf("%d \t %d \t",segment_id,shmbuffer.shm_perm.__key);
 mode = shmbuffer.shm_perm.mode;
 /** OWNER */
 if (mode & 0400)
  printf("r");
 else
  printf("-");
 if (mode & 0200)
  printf("w");
 else
  printf("-");
 if (mode & 0100)
  printf("a");
 else
  printf("-");
 /** GROUP */
 if (mode & 0040)
                printf("r");
        else
                printf("-");
        if (mode & 0020)
                printf("w");
        else
                printf("-");
        if (mode & 0010)
                printf("a");
        else
                printf("-");
 /** WORLD */
 if (mode & 0004)
                printf("r");
        else
                printf("-");
        if (mode & 0002)
                printf("w");
        else
                printf("-");
        if (mode & 0001)
                printf("a");
        else
                printf("-");
 
 printf("    \t%4d\t",shmbuffer.shm_perm.uid);
 printf(" %d\t",shmbuffer.shm_segsz);
 printf(" %d\t",shmbuffer.shm_nattch);
 printf("\n%d", mode);
 
 printf("\n");
 
 shmdt(shared_memory);
 shmctl(segment_id, IPC_RMID, NULL);
 fprintf(stdout, "\n%d", segment_id);
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Segmentation fault(段错误)通常是由于程序访问了无效的内存地址引起的。在 Linux 中,可以使用以下方法来查看段错误的原因: 1. 使用 gdb 调试器 使用 gdb 可以帮助我们定位代码中出现段错误的位置。首先,需要在编译时加上 `-g` 选项生成调试信息。然后,在运行程序时,使用 gdb 启动程序,并在出现段错误时停止程序。可以使用 `bt` 命令查看调用栈,找到出现段错误的位置。例如: ``` $ gcc -g -o myprogram myprogram.c $ gdb myprogram (gdb) run Starting program: /home/user/myprogram Program received signal SIGSEGV, Segmentation fault. 0x00005555555546d3 in main () (gdb) bt #0 0x00005555555546d3 in main () ``` 在上面的示例中,我们在 `main` 函数中出现了段错误。 2. 使用 valgrind 工具 valgrind 是一款用于检测内存泄漏和内存访问错误的工具。可以在 Linux 中使用以下命令来安装 valgrind: ``` $ sudo apt-get install valgrind ``` 然后,在运行程序时使用 valgrind 工具检测内存错误。例如: ``` $ valgrind ./myprogram ``` valgrind 会输出内存错误的详细信息,帮助我们定位问题。 3. 使用系统日志 当程序出现段错误时,Linux 系统会将错误信息写入系统日志。可以使用以下命令来查看系统日志: ``` $ dmesg | tail ``` 在输出中,可以找到与段错误相关的信息,例如内存地址和错误代码。 通过以上方法,我们可以定位并解决程序中出现的段错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值