`
tcspecial
  • 浏览: 908018 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Linux 信号量

阅读更多

    需求:如何实现fork()后的子进程退出后,再退出父进程

    

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


int main()
{
  pid_t result;
  int sem_id;

  result=fork();
  if(result==-1)
  {
	perror("fork\n");
  }else if(result==0)
  {
	printf("chind process wait for some seconds ...\n");
        sleep(5);
	printf("The returned value is %d in the child process(pid=%d)\n",result,getpid()); 
  }else{
        //int status;
        //wait(status); 
	printf("The return value is %d in the father process(pid=%d)\n",result,getpid());
  }
   
  return 0;
}

   上述代码,明显父进程先于子进程前退出

 

   解决方案一: 在父进程中调用 wait() 方法,堵塞等待子进程退出

   解决方案二: 利用信号量同步进程退出顺序. 

   

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


// 当semctl参数为4个时,必须手动定义这个联合体
union semun
{
  int val;
  struct semid_ds *buf;
  unsigned short *array;
  struct seminfo *_buf;
};


// 初始化信号量
int init_sem(int sem_id,int init_value)
{
 union semun sem_union;
 sem_union.val=init_value;
 if(semctl(sem_id,0,SETVAL,sem_union)==-1)
 {
  perror("init semphore");
  return -1;
 }
	
 return 0;
}

// 删除信号量
int del_sem(int sem_id)
{
 union semun sem_union;
 if(semctl(sem_id,0,IPC_RMID,sem_union)==-1)
 {
  perror("delete semphore");
  return -1;
 }

 return 0;
}

// p操作获取资源
int sem_p(int sem_id)
{
	struct sembuf sem_b;
	sem_b.sem_num = 0; // 单个信号量
	sem_b.sem_op = -1; // -1表p操作
	sem_b.sem_flg=SEM_UNDO; // 在进程退出时,自动释放信号量

	if(semop(sem_id,&sem_b,1)==-1)
	{
	perror("p operation");
	return -1;
	}

	return 0;
}

// v操作释放资源
int sem_v(int sem_id)
{
  struct sembuf sem_b;
  sem_b.sem_num = 0; // 信号量编号, 单个信号量
  sem_b.sem_op = 1; // +1表V操作
  sem_b.sem_flg=SEM_UNDO; // 在进程退出时,自动释放信号量
	
  if(semop(sem_id,&sem_b,1)==-1)
  {
   perror("v operation");
   return -1;
  }
	
 return 0;
}


int main(int argc,char **argv)
{
  pid_t result;
  int sem_id;

  // key_t key=ftok() 产生唯一ipc键
  sem_id=semget(ftok(".",'a'),1,0666|IPC_CREAT);
  init_sem(sem_id,0); // 设置信号量为0

  result=fork();
  if(result==-1)
  {
	perror("fork\n");
  }else if(result==0) // 子进程
  {
	printf("chind process wait for some seconds ...\n");
    sleep(5);
	printf("The returned value is %d in the child process(pid=%d)\n",result,getpid()); 
	sem_v(sem_id);   // v操作,资源数+1
  }else{ // 父进程
	sem_p(sem_id);   // 此时资源计数为0,堵塞等待子进程释放资源,当资源数>0时才向下执行
	printf("The return value is %d in the father process(pid=%d)\n",result,getpid());
	sem_v(sem_id);
	del_sem(sem_id);
  }
   
  return 0;
}

    详见: http://blog.csdn.net/mybelief321/article/details/9086151

 

 

 

 

分享到:
评论

相关推荐

    linux信号量详解

    ### Linux信号量详解 #### 一、信号量概念与历史 1965年,E.W.Dijkstra引入了信号量的概念,这是一种操作系统中用于实现进程间互斥和同步的重要机制。信号量本质上是一个包含了非负整型变量的数据结构,伴随着两个...

    linux信号量实例代码

    linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号量 实例代码linux 信号...

    linux信号量机制学习

    linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号量机制学习linux信号...

    linux信号量的源码例子

    Linux信号量是一种在多进程或多线程环境中用于同步和保护资源的重要机制。它源于操作系统理论,用于解决并发执行中的竞态条件和死锁问题。在这个源码例子中,我们将深入探讨Linux信号量的工作原理、如何创建、使用...

    linux信号量专题编程笔记.docx

    综上所述,Linux信号量是解决并发控制问题的重要手段,通过合理的使用信号量,可以有效地避免竞争条件,实现进程间的同步和互斥,从而保证系统的稳定和高效运行。在实际编程中,理解并熟练运用信号量API,可以构建出...

    Linux信号量1

    【Linux信号量1】 在多进程环境中,当多个进程需要访问同一共享资源时,可能会出现竞态条件,导致数据不一致。为了解决这个问题,Linux提供了信号量机制,这是一种同步工具,用于协调进程间的访问控制。 信号量是...

    sem.tar.gz_linux 信号量_linux 封装

    总结来说,"sem.tar.gz_linux 信号量_linux 封装"提供了一套用户友好的Linux信号量接口,对于进行多线程或多进程编程的开发者来说,这是一个非常实用的工具,可以帮助他们更好地管理和保护共享资源,避免并发访问...

    linux信号量机制

    总结来说,Linux信号量机制是通过一个计数器实现的同步机制,它允许进程或线程协调对共享资源的访问。`sem_init()`、`sem_post()`、`sem_wait()`、`sem_trywait()`和`sem_destroy()`是其核心函数,它们共同维护了...

    14_linux信号量专题讲座-王保明.rar

    本讲座"14_linux信号量专题讲座-王保明"聚焦于Linux系统中的一个重要同步机制——信号量。信号量是一种用于多线程和多进程之间协调的工具,它在并发编程中起着关键作用。 首先,我们要理解什么是信号量。信号量...

    最全面的Linux信号量学习.pdf

    【Linux信号量详解】 Linux信号量是一种用于进程和线程同步的重要机制,主要用来保护共享资源,确保在任何时刻只有一个进程或线程可以访问特定的资源。信号量的值代表资源的状态,正数表示资源可用,0表示资源被...

    Linux信号量线程控制--培训教程.pdf

    ### Linux信号量线程控制详解 #### 一、信号量概念及原理 信号量是操作系统中用于进程或线程间同步与互斥的一种机制。它通常由一个非负的整数计数器组成,用于控制对公共资源的访问。在本章节中,我们将深入探讨...

    Linux信号量通信机制分析与实践.pdf

    "Linux信号量通信机制分析与实践" Linux操作系统中,信号量通信机制是一种重要的进程间通信机制。信号量是一种特殊的变量,它可以用来解决多进程之间的互斥访问临界资源的问题。信号量的概念由E.W.Dijkstra于1965...

    Linux信号量编程实例

    介绍了Linux信号量编程的相关知识,可以用以学习操作系统中的通过信号量同步进程的机制

    操作系统——Linux信号量机制

    在Linux环境下实现一个多线程对临界资源的互斥操作,利用信号量实现对临界资源的保护,支持Linux下文件输入输出,提高对Linux环境下多进程、多线程、信号量机制和文件操作等知识的理解。 设有进程A、B、C,分别调用...

    Linux之信号量_很全面的分析_个人整理的

    ### Linux之信号量详解 #### 一、信号量概述 信号量是一种用于进程间通信的机制,主要用于协调多个进程对共享资源的访问。通过信号量的机制,可以在多个进程之间同步资源的使用,确保资源在同一时刻只被一个进程...

    Linux中信号量机制研究.pdf

    本文对Linux中的信号量机制进行了系统、深入和全面的研究,为读者提供了一个全面的了解Linux信号量机制的机会。 知识点: 1. Linux操作系统中信号量机制的应用 2. 信号量机制的分类:内核信号量和用户信号量 3. ...

    linux下信号量控制实例

    linux下信号量控制同步问题,已经通过测试,很经典

    Linux信号量源码

    在Linux在利用信号量机制实现双方通信

Global site tag (gtag.js) - Google Analytics