linux关闭死循环的fork子进程

因业务需求,需要在子进程中使用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 

====================

至此三个线程都正常退出了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值