欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

fm_main.c

linux下的人机对话编程
C
字号:
#include<gnome.h>#include<gtk/gtk.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include<sys/stat.h>#include<sys/time.h>//setpriority#include<sys/resource.h>//setpriority#include<signal.h>#include <stdio.h>#include <unistd.h>#include<stdlib.h>#include<fcntl.h>#include<errno.h>#include<time.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>//888888888#include"sendto.h"//8090 8095#include"share_mem.h"//#include"Bcmd.h"//8100#include"Bcmd_bk.h"//8200                                                                                                               /*include windows*/#include"FM_window.h"#include"SySInfo.h"#include"popmenu.h"#include"bg.h"#include"toggle.h"#include"sg.h"#include"switch.h"#include"field.h"#include"line.h"#include"text.h"#include"sig.h"#include"frame.h"#include"echo_fd.h"#include"Bcmd.h"#include"control_c.h"#define NUM 2#define FALSE_sg 0#define TRUE_sg 1int Okay;void sig_child() {   signal(SIGCHLD, sig_child);   Okay = FALSE_sg; }/*心爱好处利器,监控哪一个进程死亡,通知主号数,PID是一个唯一标志*/		gint main(gint argc,gchar *argv[]){ #if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)   /* union semun is defined by including <sys/sem.h> */#else   /* otherwise, according to X/OPEN we have to define it ourselves */  union semun/* 共享内存的共用体*/   {      int val;                    /* value for SETVAL */      struct semid_ds *buf;       /* buffer for IPC_STAT, IPC_SET */      unsigned short int *array;  /* array for GETALL, SETALL */      struct seminfo *__buf;      /* buffer for IPC_INFO ,为了加锁用*/   };#endif   //int pids[NUM];/*进程的个数,放在一个数组里面*/	int i,j;	int pid;    union semun un_win;    int flag_win = (IPC_CREAT | IPC_EXCL | 0660);/*打开共享内存的方式\权限*/   int size_win = sizeof(struct area_window);   key_t skey_win = 0x00123020; /* sample keys */   key_t mkey_win = 0x01034850;/*共享内存的 地址*/   /* get a shared memory area */   shmid_win=shmget(mkey_win, size_win, flag_win);/*获得一快共享内存的区域*/   /* attach the shared memory area */   aw=(struct area_window *)shmat(shmid_win, 0, 0);   /* initialize account info in shared memory */   aw->flag_revInfo=0;/*以下为初始化内存变量*/	aw->flag_sg=0;	for(i=0;i<30;i++)		{		for(j=2;j<4;j++)		aw->SgNode_DynTab[i][j]=0;		}	 j=0x8000;	for(i=0;i<30;i++)		{		aw->SgNode_DynTab[i][1]=0x01;		aw->SgNode_DynTab[i][0]=j++;		}	aw->SgNode_DynTab[10][1]=0x03;	aw->SgNode_DynTab[11][1]=0x03;	aw->SgNode_DynTab[20][1]=0x03;//flag_SG init	for(i=0;i<25;i++)	aw->flag_SG[i]=0;	aw->flag_sw=0;	 j=0x4000;        for(i=0;i<17;i++)                {                aw->SwNode_DynTab[i][0]=j++;                aw->SwNode_DynTab[i][1]=0xaa;		aw->SwNode_DynTab[i][2]=0;		aw->SwNode_DynTab[i][3]=0xaa;		}	aw->flag_fd=0;	 j=0x2000;for(i=0;i<25;i++)                {                aw->FdNode_DynTab[i][0]=j++;		aw->FdNode_DynTab[i][1]=0xaa;                aw->FdNode_DynTab[i][2]=0;                }   /* get and initialize a semaphore */   semid_win=semget(skey_win, 1, flag_win);   /* set semaphore available */   un_win.val=1;   semctl(semid_win, 0, SETVAL, un_win);   /* first and only semaphore */   buf_win.sem_num=0;   /* wait if set */   buf_win.sem_flg=0;   /* setup SIGCHLD handler */   signal(SIGINT,control_c);   signal(SIGCHLD, sig_child);/*安装信号处理起*/if((aw->pids[0]=fork())==0)//Acheck	{	printf("\tAcheck is started up pid= %d\n",getpid());        B_receivecmd();/*接收网罗通信动态马进程*/	}if((aw->pids[1]=fork())==0)//Acheck        {        printf("\tAcheck is started up pid= %d\n",getpid());        B_receivecmd_bk();/*上面的备份*/        }/*if((pids[2]=fork())==0)//A_receivecmd        {        printf("\tAreceivecmd is started up pid= %d\n",getpid());        fm_main(argc,argv);        }*/fm_main(argc,argv); while(1)/*监控哪一个进程丝网,PID能监测到*/{	Okay=TRUE_sg;      while(Okay) /* pause */         usleep(1);      pid=wait(NULL); /* exiting pid */      for(i=0;i<NUM;i++)/*根据PID重起相应的进程*/        {	if(pid==aw->pids[i])        break;	}      printf("\tSubtask #%d ended, pid = %d\n", i, aw->pids[i]);	switch(i)	{		case 0:			{			if((aw->pids[0]=fork())==0)//Acheck		        {		        printf("\tAcheck is started up pid= %d\n",getpid());		         B_receivecmd();		        }			break;			}		case 1:                        {                        if((aw->pids[1]=fork())==0)//Acheck                        {                        printf("\tAcheck is started up pid= %d\n",getpid());                         B_receivecmd_bk();                        }                        break;                        }	/*	 case 2:                        {			if((pids[2]=fork())==0)//A_receivecmd		        {		        printf("\tAreceivecmd is started up pid= %d\n",getpid());		        fm_main(argc,argv);		        }			break;                      }*/				}//switch}//while(1) //free the memory/*应该不修改号码.键盘响应来释放内存*/}//main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -