I've Sound 音樂聯盟(爱萌音乐)

 找回密码
 加入爱萌
搜索
热搜: 同人 原创
查看: 1568|回复: 9

[心情] 啊啊啊啊啊我要疯了,让代码飞一会儿!

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

好想发牢骚,更加想请会操作系统的高人赐教。。。
怎么办,睡不着了,明天就要交作业(现在已经是明天了,嗯)
依然无法发现问题所在,疯了。。。要疯了。。。Linux这货,你块飞一会儿吧。。。!
发表于 2011-4-23 08:52 | 显示全部楼层
这年头还有通宵写作业的孩子么
Debug的确烦
回复 支持 反对

使用道具 举报

发表于 2011-4-23 10:32 | 显示全部楼层
什么问题呢……那么麻烦…………
如果是Linux编程可以尝试用GDB调试阿~~
回复 支持 反对

使用道具 举报

发表于 2011-4-23 11:05 | 显示全部楼层
我只弄过一些简单的代码,  例如网页代码之类的,  发现有问题的时候, 就用排除法, 一段一段的删减, 直到找到那个模块, 再缩小范围的寻找.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-23 11:17 | 显示全部楼层
好吧,我也不知道是出了什么问题。。。
其实就是做一个很简单的管道共享内存通信而已。。。
就这么上交了,希望不要不及格。。。
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

 楼主| 发表于 2011-4-23 14:19 | 显示全部楼层
哦哦,原来是IPC里面的共享内存。
进程通信是比较麻烦的,特别是调试,因为程序的行为比较不可预测。
可以 ...
airekans 发表于 2011-4-23 12:17



    不不。。。没有乃想的这么复杂阿!
     初学新手而已,这么說可能不好解释。代码给乃看看吧。
[myinput.c]
#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[512];

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);//切断与共享内存的连接

}


[mysem.c]

#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);

}



很简单的吧?可是就是搞不懂。。。
回复 支持 反对

使用道具 举报

发表于 2011-4-23 18:43 | 显示全部楼层
回复 7# 抗坏血酸

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

myinput.c:
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<linux/shm.h>
  5. #include<unistd.h>
  6. #include<sys/types.h>

  7. typedef struct shared_use_st {
  8.         int written_by_you;
  9.         char buffer[512];
  10. } Shared_use_st;

  11. main()
  12. {
  13.         int myshm;
  14.         void *viraddr;
  15.         Shared_use_st *shared_mem;

  16.         char buffer[512];

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

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

  21.         while(1){

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

  25.                         fgets(buffer,512,stdin);

  26.                         strcpy(shared_mem->buffer,buffer);

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

  29.                         shared_mem->written_by_you = 1;
  30.                 }
  31.                 else
  32.                 {
  33.                         sleep(1);
  34.                 }

  35.         }

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

  37. }
复制代码
mysem.c:
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<linux/shm.h>
  5. #include<unistd.h>
  6. #include<sys/types.h>

  7. typedef struct shared_use_st {
  8.         int written_by_you;
  9.         char buffer[512];
  10. } Shared_use_st;

  11. main()
  12. {

  13.         int myshm;
  14.         void *viraddr;
  15.         Shared_use_st *shared_mem;

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

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

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

  23.         shared_mem = (Shared_use_st*) viraddr;

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

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

  30.         shared_mem->written_by_you = 0;

  31.         sleep(10);

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

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

  34.         exit(0);

  35. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2011-4-23 19:32 | 显示全部楼层
又发现人才了.  

技术党V5啊.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-23 21:28 | 显示全部楼层
回复  抗坏血酸

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



    呜哇。。。好感动。。。
     竟然在IVE认识到高手。。。
     谢谢赐教阿╱人◕‿‿◕人╲
    还好今天程序刚打印出來没上交呢~重新弄一份哈哈。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入爱萌

本版积分规则

小黑屋|手机版|Archiver|I've Sound 音樂聯盟(爱萌音乐)

GMT+8, 2024-11-22 01:59 , Processed in 0.083335 second(s), 8 queries , Gzip On, File On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表