免费注册 查看新帖 |

Chinaunix

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

父子进程互送信号的源程序中的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-16 20:23 |只看该作者 |倒序浏览
源程序如下:

#include <signal.h>;
int count = 0;

main()
{
  int pid, ppid;
  void p_action(), c_action();
  signal(SIGUSR1, p_action);
  switch( pid = fork() )
  {
    case -1: perror("synchro "; exit(1);
    case 0: signal(SIGUSR1, c_action);
            ppid = getppid();
            for(;
            {
              sleep(1); // ……………………………………………………1
              kill(ppid, SIGUSR1);
              pause();
            }
    default:
             for(;
             {
                pause();
                sleep(1); //…………………………………………………2
                kill(pid, SIGUSR1);
              }
  }
}

void p_action(int signo)
{
  printf("arent caught signal %d # %d\n", signo,++count);
  signal(SIGUSR1,p_action);
}

void c_action(int signo)
{
  printf("Child  caught signal %d # %d\n", signo,++count);
  signal(SIGUSR1, c_action);
}
程序中有俩个sleep(1),你分别注释掉其中的一个看看会有什么效果
(可要扶住眼睛啊) 有搞的明白的请说出其中的原因 谢谢

论坛徽章:
0
2 [报告]
发表于 2003-10-18 00:59 |只看该作者

父子进程互送信号的源程序中的一个问题

Pls try my pg:   

Pls don't look the comm. I write it in French. I' m so lazy, I'd not 2 translate in English.
------------------------------------------------------------------
#include <stdio.h>;
#include <sys/sem.h>;
#include <sys/shm.h>;
#include <sys/ipc.h>;
#include <sys/types.h>;
#include <stdlib.h>;
#include <time.h>;
#include <errno.h>;
#include <wait.h>;
#include <string.h>;

int main()
{      


int drap;   /* pour la creation de la cle IPC */
int mode;
int clem;

int res;    /* pour verifier les codes retour */

int fils;   /* pour la gestion du pere-fils */
int status;

int memp;  /* descripteur de la memoire partagee */

int taille; /* taille de la memoire partagee */

struct shmid_ds shminfo;  /* pour recuperer des informations sur la memoire partagee */

char *test, *ntest; /* pour les tests sur la memoire partagee (on y stocke une chaine) */
char alphabet[40];



drap=IPC_CREAT|IPC_EXCL;  /* la cle IPC ne doit pas exister */
mode=0666;                /* les droits sur la ressource */
clem=ftok("memp1.c",'b'); /* generation de la cle IPC */
taille=2000;              /* initialisation de la taille de memoire partagee */


memp=shmget(clem,taille,drap|mode); /* creation du descripteur de ressources */
if (memp==-1)
   { perror("creation de la memoire partagee ";
   }
else { printf("idf de la memoire partagee %d\n",memp);

       res=shmctl(memp,IPC_STAT,&shminfo);  /* recuperation d'informations */
       if (res==-1)
           perror("stat avant attachement ";
       else { /* affichage des informations recuperees */
              printf("----------0--taille en octets %d\n",shminfo.shm_segsz);
              printf("----------0--pid proprietaire %d\n",shminfo.shm_cpid);
              printf("----------0--nombre d'attachements %d\n",shminfo.shm_nattch);
          
              /* attachement de la memoire partagee (sur la variable test) */
              test=(char *)shmat(memp,(char *)0,0);       
              if (test==(char *)-1)
                 perror("premier attachement de la memoire partagee ";
              else { printf("resultat sur le premier attachement %s\n",test);
                     /* initilaisation et remplissage de la variable test */
                     bzero(test,taille);  
                     strcpy(alphabet,"aaaaaaaaaaaaaaaaaaaaa";
                     memcpy(test,alphabet,20);
                     printf("valeur de la variable test avant le fork %s\n",test);

                     res=shmctl(memp,IPC_STAT,&shminfo); /* recuperation d'informations */
                     if (res==-1)
                        perror("stat apres le premier attachement \n";
                     else {
                            printf("----------1--taille en octets %d\n",shminfo.shm_segsz);
                            printf("----------1--pid proprietaire %d\n",shminfo.shm_cpid);
                            printf("----------1--nombre d'attachements %d\n",shminfo.shm_nattch);          
          
                            /* creation du processus fils */
                            fils=fork();
                            if (fils==0)
                               { /* programme fils */
                                 printf(">;>; debut du fils\n";
                                 printf("valeur de memp dans le fils %d\n",memp);
                                 /* attachement de la memoire partagee (sur la variable ntest) */
                                 ntest=(char *)shmat(memp,(char *)0,0);
                                 if (ntest==(char *)-1)
                                     perror("second attachement";
                                 else { printf("resultat sur le second attachement %s\n",ntest);
                                 
                                        /* recuperation d'informations */
                                        res=shmctl(memp,IPC_STAT,&shminfo);
                                        if (res==-1)
                                           perror("stat apres second attachement \n";
                                        else { printf("----------2--taille en octets %d\n",shminfo.shm_segsz);
                                               printf("----------2--pid proprietaire %d\n",shminfo.shm_cpid);
                                               printf("----------2--nombre d'attachements %d\n",shminfo.shm_nattch);          

                                               printf("valeur initiale de la variable ntest dans le fils %s\n",ntest);

                                               /* ecriture dans la variable partagee */
                                               strcpy(alphabet,"bbbbbbbbbb";
                                               memcpy(ntest,alphabet,10);
                                               printf("valeur modifiee de la variable testnum dans le fils %s\n",ntest);

                                               printf(">;>; fin du fils\n";
                                               return(0);
                                              }
                                       }
                                }
                             else
                                  { /* programme pere */
                                    sleep(10);
                                    printf("pg principal: apres fork le pid du fils est %d\n",fils);
  
                                    /* modification de la variable partagee */
                                    strcpy(alphabet,"ccccc");
                                    memcpy(test,alphabet,5);
                                    printf("valeur de la variable test en fin de pere %s\n",test);
  
                                    /* suppression de la ressource IPC */
                                    res=shmctl(memp,IPC_RMID, &shminfo);
                                    
                                    /* fin du pere */
                                    res=wait(&status);
                                    
  
                                   }
           }
         }  
        }
     }
  return(0);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP