如何检查共享内存是否为空?

时间:2016-05-10 18:20:13

标签: c null shared-memory coredump

我使用共享内存的项目,每次都有一个while循环读取,因此我想检查它是否为空。 使用以下命令打开共享内存:

key_t key;
int shmid;
if ((key = ftok("ex31.c", 'k')) == -1){
    perror("ftok");
    exit(1);}
if ((shmid = shmget(key, 3, FLAGS)) == -1) {
            perror("shmget");
            exit(1);}
char* shmaddr;
if( shmaddr=shmat(shmid,0,0) == (char*)-1){
    printf("error in attaching to the shared memory\n");
    exit(0);}
if(shmaddr==NULL) /// THROWS EXCEPTION!!

它给了我错误:

 segmentation fault (core dumped)

.. HELP?

1 个答案:

答案 0 :(得分:2)

我建议您快速查看完整程序,看看运行两次时会发生什么,首先使用-1参数,然后再使用{{{{}}参数1}}:

42

成绩单如下:

#include <stdio.h>
int main (int argc, char *argv[]) {
    int i;
    if (i = atoi (argv[1]) == -1)
        printf ("   WAS negative one: %d\n", i);
    else
        printf ("   was NOT negative one: %d\n", i);
    return 0;
}

您可以看到即使它正确检测到pax> ./testprog -1 WAS negative one: 0 pax> ./testprog 42 was NOT negative one: 1 值,但在比较后似乎没有正确设置atoi

如果你查看你的代码,你已经知道(或很快知道,一旦你读完这个答案)如何解决这个问题。将您的错误行与其他行进行比较(两者都略有重新格式化以使其显而易见):

i

第二行没有按预期工作的原因是因为if ((shmid = shmget (key, 3, FLAGS)) == -1 ) { if (shmaddr = shmat (shmid, 0, 0 ) == (char*)-1) { // ^ ^ // \_______extra parentheses_______/ 高于优先级高于==。这意味着第一行符合您的要求,但第二行符合

=

如您所见,该优先级规则意味着首先计算表达式if (shmaddr = (shmat (shmid, 0, 0) == (char*)-1) ) { // \ \________higher________________/ / // \____________________lower________________/ ,然后将结果(shmat (shmid, 0, 0) == (char*)-1表示true或1表示false)分配给{ {1}}。这些值非常不太可能是有效的内存地址,因此当您尝试取消引用它时,几乎肯定会导致崩溃(a)

您需要的行应与其他两行的格式相匹配,并在作业周围加上括号以确保首先完成:

0

(a)分配shmaddr的情况与您的情况无关,因为这意味着if ((shmaddr = shmat (shmid, 0, 0)) == (char*)-1)) { // ^ ^ // \__________add these_________/ 条件评估为真,您的程序将退出。因此,尝试取消引用1的代码的路径将其设置为0.