免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2849 | 回复: 3
打印 上一主题 下一主题

[C] 在学多进程,遇到了一些不懂的地方?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-03 22:27 |只看该作者 |倒序浏览
我用多线程来循环播放MP3歌曲,(MP3歌曲保存在,pt_SongInfo  队列里面)

  1. static void Play( pt_SongInfo Head )
  2. {
  3.     pid_t pid;
  4.    
  5.     pt_SongInfo temp = Head;
  6.     if (!Head)
  7.     {
  8.         printf("The Head list is empty \n");
  9.         exit(0);
  10.     }
  11.    
  12.     temp = temp->prior;
  13.     while (1)
  14.     {
  15.         temp = temp->next;           

  16.         pid = fork();   
  17.         printf("####play  function %d##### \n",getpid());
  18.         if (pid == 0)
  19.         {   
  20.             pt_shareInfo shm_info = (pt_shareInfo)shmat(shmid, 0, 0);
  21.             if (shm_info == NULL)
  22.             {
  23.                 printf("share memory get address error \n");
  24.                 exit(0);
  25.             }
  26.             strcpy(shm_info->name,temp->name);
  27.             shm_info->grandson = getpid();
  28.             execlp("madplay","madplay","-a -50",temp->name,NULL);
  29.             printf("\n@@@@@@@@@@@@@@@@@@@@ NEXT  SONG  START @@@@@@@@@@@@@@@@@@@@\n");
  30.         }
  31.         else
  32.         {
  33.             wait(NULL);
  34.         }
  35.     }
  36. }
复制代码
这个代码 我通过  
printf("####play  function %d##### \n",getpid());
打印测试结果:
第一次播放
####play  function 1315#####
####play  function 1314#####

第2收
####play  function 1316#####
####play  function 1314#####


第3首
####play  function 1317#####
####play  function 1314#####


我的疑问是:
1、为什么一个print ,会出现 两行打印信息?
2、无论循环多少次  ####play  function 1314#####   一定是存在的。(只要不关闭)


刚刚学 linux 应用编程,不是特别明白,再次请教
谢谢

论坛徽章:
1
戌狗
日期:2014-03-04 13:31:12
2 [报告]
发表于 2014-04-04 10:44 |只看该作者
了解一下多进程,fork就知道了。
主进程和子进程都从fork()返回后的代码开始执行,都有执行到这个printf()。
1314就是你主进程的PID

论坛徽章:
0
3 [报告]
发表于 2014-04-07 21:37 |只看该作者
要想只打印一个,就把第18行的代码挪挪位置。

论坛徽章:
2
2015亚冠之莱赫维亚
日期:2015-09-14 11:19:42操作系统版块每日发帖之星
日期:2015-11-05 06:20:00
4 [报告]
发表于 2014-04-09 09:04 |只看该作者

        pid = fork();   <- fork完成创建子进程共享后面的代码
        printf("####play  function %d##### \n",getpid()); <-子进程,父进程执行
        if (pid == 0) <- 判断进程号
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP