抗坏血酸 发表于 2011-4-23 01:04

啊啊啊啊啊我要疯了,让代码飞一会儿!

{:nm_04:} 搞到这么晚,这真的是未来程序员的痛苦么?
虽然不怎么后悔选择了软件这个专业但是目前就为这个程序头痛死了。
不是出了什么很严重的问题,而是看一大串代码根本找不到问题出在哪里,就这么白白对着电脑屏幕到凌晨一点中。。。
5小时阿!有木有!有木有!敲代码的孩子伤不起阿!
千千静听里面49首歌曲播放了N次,都块鬼畜循环了。。。Suara你的春夏秋冬也治愈不了现在的我阿。。。

好想发牢骚,更加想请会操作系统的高人赐教。。。
怎么办,睡不着了,明天就要交作业(现在已经是明天了,嗯)
依然无法发现问题所在,疯了。。。要疯了。。。Linux这货,你块飞一会儿吧。。。!

中微小 发表于 2011-4-23 08:52

这年头还有通宵写作业的孩子么
Debug的确烦

airekans 发表于 2011-4-23 10:32

什么问题呢……那么麻烦…………
如果是Linux编程可以尝试用GDB调试阿~~

迷失的风儿 发表于 2011-4-23 11:05

我只弄过一些简单的代码,例如网页代码之类的,发现有问题的时候, 就用排除法, 一段一段的删减, 直到找到那个模块, 再缩小范围的寻找.

抗坏血酸 发表于 2011-4-23 11:17

好吧,我也不知道是出了什么问题。。。
其实就是做一个很简单的管道共享内存通信而已。。。
就这么上交了,希望不要不及格。。。

airekans 发表于 2011-4-23 12:17

哦哦,原来是IPC里面的共享内存。
进程通信是比较麻烦的,特别是调试,因为程序的行为比较不可预测。
可以的话利用输出语句一步一步的输出自己认为绝对没有问题的部分,来验证程序是否和自己预测的相同。
对于IPC涉猎的不多,只能给这么多建议了~~

PS: 如果想要深入了解一下IPC的话,可以看看《Unix网络编程第2卷》。
同是软件工程阿~~LZ握手~~

抗坏血酸 发表于 2011-4-23 14:19

哦哦,原来是IPC里面的共享内存。
进程通信是比较麻烦的,特别是调试,因为程序的行为比较不可预测。
可以 ...
airekans 发表于 2011-4-23 12:17 http://www.ivemusic.net/images/common/back.gif


    不不。。。没有乃想的这么复杂阿!
   初学新手而已,这么說可能不好解释。代码给乃看看吧。

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

#include<linux/shm.h>

#include<unistd.h>

#include<sys/types.h>

main()
{

int myshm;

char * viraddr;

char buffer;

myshm=shmget(999,512,0770|IPC_CREA);//创建或获取共享内存id

viraddr = (char*)shmat(myshm,0,0);//附接到共享内存

while(1){

printf("please input your chares:\n");

fgets(buffer,512,stdin);

strcat(viraddr,buffer);
if(strncmp(buffer,"end",3)==0)
break;
}

shmdt(viraddr);//切断与共享内存的连接

}




#include<stdlib.h>

#include<stdio.h>

#include<string.h>

#include<linux/shm.h>

#include<unistd.h>

#include<sys/types.h>

main()
{

int myshm;

char* viraddr;

myshm = shmget(999,512,0770|IPC_CREAT);//创建或获取共享内存id

viraddr = (char*)shmat(myshm,0,0);//附接到共享内存

printf("the message is:\n%s",viraddr);

shmdt(viraddr);//切断与共享内存的连接

shmcrtl(myshm,IPC_RMID,0);//撤销共享内存

exit(0);

}



很简单的吧?可是就是搞不懂。。。

airekans 发表于 2011-4-23 18:43

回复 7# 抗坏血酸

呃,其实我对共享内存也不太熟,翻了下《Linux程序设计》之后,将你的程序改动如下就可以通过了。
主要问题是你使用了共享内存,但是没有利用别的机制进行同步,使得mysem没有等待myinput放入数据就直接输出。
这里我就按书上写的用了一个struct来进行同步了。
再多的你可以自己看看《Linux程序设计》里面关于共享内存的部分。

myinput.c:#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<linux/shm.h>
#include<unistd.h>
#include<sys/types.h>

typedef struct shared_use_st {
        int written_by_you;
        char buffer;
} Shared_use_st;

main()
{
        int myshm;
        void *viraddr;
        Shared_use_st *shared_mem;

        char buffer;

        myshm=shmget(1234,sizeof(Shared_use_st),0666|IPC_CREAT);//创建或获取共享内存id

        viraddr = shmat(myshm,(void*)0,0);//附接到共享内存
        shared_mem = (Shared_use_st*) viraddr;
        shared_mem->written_by_you = 0;

        while(1){

                if (shared_mem->written_by_you == 0)
                {
                        printf("please input your chares:\n");

                        fgets(buffer,512,stdin);

                        strcpy(shared_mem->buffer,buffer);

                        if(strncmp(shared_mem->buffer,"end",3)==0)
                                break;

                        shared_mem->written_by_you = 1;
                }
                else
                {
                        sleep(1);
                }

        }

        shmdt(viraddr);//切断与共享内存的连接

}mysem.c:#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<linux/shm.h>
#include<unistd.h>
#include<sys/types.h>

typedef struct shared_use_st {
        int written_by_you;
        char buffer;
} Shared_use_st;

main()
{

        int myshm;
        void *viraddr;
        Shared_use_st *shared_mem;

        myshm = shmget(1234,sizeof(Shared_use_st),0666|IPC_CREAT);//创建或获取共享内存id

        if (myshm == -1)
        {
                fprintf(stderr, "shmget failed.\n");
                exit(1);
        }

        viraddr = shmat(myshm,(void*)0,0);//附接到共享内存

        shared_mem = (Shared_use_st*) viraddr;

        while (shared_mem->written_by_you == 0)
        {
                sleep(1);
                printf("waiting for data...\n");
        }

        printf("the message is:\n%s",shared_mem->buffer);

        shared_mem->written_by_you = 0;

        sleep(10);

        shmdt(viraddr);//切断与共享内存的连接

        shmctl(myshm,IPC_RMID,0);//撤销共享内存

        exit(0);

}

迷失的风儿 发表于 2011-4-23 19:32

又发现人才了.

技术党V5啊.

抗坏血酸 发表于 2011-4-23 21:28

回复抗坏血酸

呃,其实我对共享内存也不太熟,翻了下《Linux程序设计》之后,将你的程序改动如下就可以 ...
airekans 发表于 2011-4-23 18:43 http://www.ivemusic.net/images/common/back.gif


    呜哇。。。好感动。。。
   竟然在IVE认识到高手。。。
   谢谢赐教阿╱人◕‿‿◕人╲
    还好今天程序刚打印出來没上交呢~重新弄一份哈哈。
页: [1]
查看完整版本: 啊啊啊啊啊我要疯了,让代码飞一会儿!