因业务需求,需要在子进程中使用while(1)循环,那么如何退出就成了个头疼的事情
原设计是使用kill,但是子进程的ID一直无法正确存储,最后就使用共享内存来传递一个标志位来控制while(1)的退出。
示例代码如下:
#include <stdio.h>
#include <sys/shm.h> //共享内存
#include <sys/stat.h> //PERM S_IRUSR | S_IWUSR
#include <errno.h> //errno
#define PERM S_IRUSR | S_IWUSR //用户读写 <sys/stat.h>
static int a = 0; /*子进程停止标志*/
//创建共享存储区
int shm_create()
{
int shmid;
//shmid = shmget(IPC_PRIVATE, 1024, PERM);
if ((shmid = shmget(IPC_PRIVATE, 8, PERM)) == -1)
{
fprintf(stderr, "Create Share Memory Error:%s\n\a", strerror(errno));
exit(1);
}
return shmid;
}
int main()
{
char buf_read[100] = {"\0"};/*测试使用,用来控制流程启动*/
int pid1,pid,i;
unsigned char* write_char;
unsigned char* read_char;
int shmid;
shmid = shm_create(); //创建共享存储区
write_char = shmat(shmid, 0, 0); //shmat将shmid所代表的全局的共享存储区关联到本进程的进程空间
memset(write_char,0,sizeof(unsigned char));
pid = fork();
if(pid==0)
{
pid1 = fork();
if(pid1==0)
{
for(i=0;i<50;i++)
{
read_char = shmat(shmid, 0, 0); //读取共享存储区的内容
if(*read_char)
{
printf("pid1=0 read_char[%d]\n",*read_char);
break;
}
sleep(2);
printf("[%d]fork2_1:pid1[%d] ppid[%d] pgid[%d]\n",i,pid1,getppid(),getpgid(pid1));
}
}
else
{
for(i=0;i<50;i++)
{
read_char = shmat(shmid, 0, 0); //读取共享存储区的内容
if(*read_char)
{
printf("pid1>0 read_char[%d]\n",*read_char);
break;
}
sleep(2);
printf("[%d]fork2_2:pid1[%d] ppid[%d] pgid[%d]\n",i,pid1,getppid(),getpgid(pid1));
}
}
}
else
{
printf("fork1:pid[%d] ppid[%d] pgid[%d]\n",pid,getppid(),getpgid(pid));
}
sleep(5); //等待子进程充分运行
fgets(buf_read, 100, stdin); /*测试使用,用来控制流程启动*/
memset(write_char,1,sizeof(unsigned char));
printf("set char 1 \n");
return 0;
}
========================================================================
程序输出:
fork1:pid[6572] ppid[6217] pgid[6571]
[0]fork2_2:pid1[6573] ppid[6571] pgid[6571]
[0]fork2_1:pid1[0] ppid[6572] pgid[6571]
[1]fork2_2:pid1[6573] ppid[6571] pgid[6571]
[1]fork2_1:pid1[0] ppid[6572] pgid[6571]
[2]fork2_2:pid1[6573] ppid[6571] pgid[6571]
[2]fork2_1:pid1[0] ppid[6572] pgid[6571]
[3]fork2_2:pid1[6573] ppid[6571] pgid[6571]
[3]fork2_1:pid1[0] ppid[6572] pgid[6571]
[4]fork2_2:pid1[6573] ppid[6571] pgid[6571]
[4]fork2_1:pid1[0] ppid[6572] pgid[6571]
[5]fork2_2:pid1[6573] ppid[6571] pgid[6571]
[5]fork2_1:pid1[0] ppid[6572] pgid[6571]
1-------(shell输入的任意字符)
set char 1
vmuser@Linux-host:~/桌面/test/fork_test$ [6]fork2_2:pid1[6573] ppid[1] pgid[6571]
pid1>0 read_char[1]
[6]fork2_1:pid1[0] ppid[6572] pgid[6571]
pid1=0 read_char[1]
set char 1
set char 1
====================
至此三个线程都正常退出了。