信号通信,其实就是内核向用户空间进程发送信号,只有内核才能发信号,用户空间进程不能发送信号。信号已经是存在内核中的了,不需要用户自己创建。
信号通信的框架 * 信号的发送(发送信号进程):kill、raise、alarm * 信号的接收(接收信号进程) : pause()、 sleep、 while(1) * 信号的处理(接收信号进程) :signal#include #include #include #include int main(int argc,char *argv[]) { int pid,sig; if(argc != 3) { printf("输入错误\n"); return -1; } sig = atoi(argv[1]); pid = atoi(argv[2]); printf("pid = %d,sig = %d\n",pid,sig); int rnt = kill(pid,sig); if(rnt == 0) { printf("杀死进程%d成功\n",pid); } return 0; } ~
运行结果:#include #include #include #include int main() { printf("hello;\n"); //int rnt = raise(9); int rnt = kill(getpid(),9); if(rnt == 0) { printf("杀死自己成功\n"); } printf("world\n"); return 0; }
#include #include #include int main() { int i; alarm(5); printf("alarm start\n"); for(i =0 ;i<20;i++) { sleep(1); printf("i = %d\n",i); } return 0; }
运行结果:#include #include #include int main() { int i,rnt; printf("pause start\n"); pause(); for(i =0 ;i<20;i++) { sleep(1); printf("i = %d\n",i); } return 0; }
运行结果: #include #include #include void myfun(int signum) { int i; while(i<5) { printf("signum = %d,i = %d\n",signum,i); i++; sleep(1); } } int main() { int i,rnt; signal(14,myfun);//14信号是定时器到时发出 printf("alarm start\n"); alarm(7); for(i =0 ;i<10;i++) { sleep(1); printf("i = %d\n",i); } return 0; }
运行结果:#include #include #include void myfun(int signum) { int i; while(i<5) { printf("signum = %d,i = %d\n",signum,i); i++; sleep(1); } } int main() { int i,rnt; signal(14,myfun);//14信号是定时器到时发出 printf("alarm start\n"); alarm(7); signal(14,SIG_IGN); for(i =0 ;i<10;i++) { sleep(1); printf("i = %d\n",i); } return 0; }
运行结果:#include #include #include void myfun(int signum) { int i; while(i<5) { printf("signum = %d,i = %d\n",signum,i); i++; sleep(1); } } int main() { int i,rnt; signal(14,SIG_DFL); printf("alarm start\n"); alarm(7); for(i =0 ;i<10;i++) { sleep(1); printf("i = %d\n",i); } return 0; }
运行结果:#include #include #include #include #include int main() { int semID; semID = semget(IPC_PRIVATE,3,0755); if(semID == -1) { printf("信号灯创建失败\n"); perror("semget:"); return -1; } else { printf("信号灯创建成功,semID = %d\n",semID); } system("ipcs -s");//查看信号灯信息 return 0; }
运行结果:#include #include #include #include #include int main() { int semID; semID = semget(IPC_PRIVATE,3,0755); if(semID == -1) { printf("信号灯创建失败\n"); perror("semget:"); return -1; } else { printf("信号灯创建成功,semID = %d\n",semID); } system("ipcs -s");//查看信号灯信息 semctl(semID,1,IPC_RMID,NULL); printf("删除过后的信号灯\n"); system("ipcs -s"); return 0; } ~
运行结果:
#include #include #include #include #include #include #define SEM_READ 0 #define SEM_WRITE 0 union semun { int val; }; void pfuntion(int id,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; semop(id,&sem,1); } void vfuntion(int id,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = 1; sem.sem_flg = 0; semop(id,&sem,1); } int main() { key_t key; pid_t pid; int shmid,semid; char *shmaddr; key = ftok("a.c",1); semid = semget(key,2,IPC_CREAT|0755);//创建信号灯 if(semid == -1) { perror("semget"); return -1; } shmid = shmget(key,128,IPC_CREAT|0755);//创建共享内存 if(shmid == -1) { perror("shmget"); return -2; } //初始化信号灯 union semun mynu; //初始化读 mynu.val = 0;//读的信号灯值 semctl(semid,SEM_READ,SETVAL,mynu); //初始化写 mynu.val = 1;//写的信号灯值 semctl(semid,SEM_WRITE,SETVAL,mynu); pid = fork(); if(pid == -1) { perror("fork"); return -3; } if(pid > 0) { printf("这是一个父进程\n"); while(1) { shmaddr = (char *)shmat(shmid,NULL,0); pfuntion(semid,SEM_READ); printf("父进程请输入数据:"); fgets(shmaddr,32,stdin); vfuntion(semid,SEM_WRITE); } } if(pid == 0) { printf("这是一个子进程\n"); while(1) { shmaddr = (char *)shmat(shmid,NULL,0); pfuntion(semid,SEM_READ); printf("子进程读取到的数据是:%s\n",shmaddr); vfuntion(semid,SEM_WRITE); } } return 0; }
运行结果:
下一篇:nginx服务器