我使用共享内存的项目,每次都有一个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?
答案 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.