Chinaunix

标题: 在学多进程,遇到了一些不懂的地方?? [打印本页]

作者: notepad265    时间: 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 应用编程,不是特别明白,再次请教
谢谢
作者: 肥头大呆脑    时间: 2014-04-04 10:44
了解一下多进程,fork就知道了。
主进程和子进程都从fork()返回后的代码开始执行,都有执行到这个printf()。
1314就是你主进程的PID
作者: 资深项目经理    时间: 2014-04-07 21:37
要想只打印一个,就把第18行的代码挪挪位置。
作者: lixinwei1985@si    时间: 2014-04-09 09:04

        pid = fork();   <- fork完成创建子进程共享后面的代码
        printf("####play  function %d##### \n",getpid()); <-子进程,父进程执行
        if (pid == 0) <- 判断进程号




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2