linux进程间通信(一)

本文介绍了Linux环境下进程管理的基础知识,包括进程创建、终止、等待、通信等关键函数及其使用方法。详细探讨了fork、vfork、system等创建进程的函数,以及pipe、mkfifo等实现进程间通信的技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程创建的相关函数:

1.getpid
函数作用:获取进程识别码
函数原型:pid_t  getpid(void)
返回值:目的进程的进程号
头文件:#include<unistd.h>

2.fork
函数作用:创建一个进程
函数原型:pid_t fork(void)
返回值:    < 0       出错
                  = 0       表示当前创建的子进程
     > 0       父进程,返回值是子进程的进程号 
性质:创建的子进程把父进程的资源拷贝了一份,父子进程把所有的重新执行一遍

3.vfork
函数作用:建立一个新的进程
函数原型:pid_t vfork(void)       子进程后面加exit(0)
返回值:错误:-1;成功返回PID(子进程)
特点:子进程先运行,退出,父进程才能运行

fork与vfork的区别:
(1)fork:子进程拷贝父进程的数据段
vfork:子父进程共享数据段
(2)fork:父子进程执行顺序不确定
vfork:子进程先运行,退出,父进程再运行

4.system
函数作用:执行一个shell命令
函数原型:int system(const char * string)

5.wait
函数作用:阻塞进程,等待某个子进程退出
函数原型:pid_t  wait(int *status)   暂停目前进程的进程
返回值:成功返回子进程PID,失败返回-1

6.waitpid
函数作用:等待退出,等待信号,或者指定的进程结束
函数原型:pid_t  wait(pid_t pid, int *status,int options)
参数:    pid < -1  等待进程pid绝对值的任何的子进程
       pid = -1     任何子进程
 pid  = 0      等待进程组识别码与目前进程相同的任何子进程
       pid > 0       等待子进程为pid的子进程退出
WNOHANG:如果没有子进程退出,马上返回不等待
W WNOHANG ONTRACED:若子进程进入暂停执行情况,马上返回
返回值:成功返回子进程的pid,失败返回-1。若使用 WNOHANG ,无子进程退出,返回0

7.exit
函数的作用:正常结束进程
函数原型:void exit(int status)

返回子进程pid的函数用红色标记

进程通信目的:

1.数据传输

    一个进程需要将它的数据发送给另一个进程
2.资源共享
    多个进程之间共享同样的资源
3.通知事件
    一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件
4.进程控制

    有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变

现在Linux使用的进程间通信方式包括:

1、无名管道(pipe)和有名管道(FIFO)
2、信号(signal)
3、消息队列
4、共享内存
5、信号量
6、套接字(socket)

下面介绍管道通信:

管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。数据被一个进程读出后,将被从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制机制,进程试图读空管道时,进程将阻塞。同样,管道已经满时,进程再试图向管道写入数据,进程将阻塞。
管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。

pipe(无名管道)
函数原型:int pipe(int intfds[2])
函数参数:新建的两个描述符由fds数组返回,fds[0]是管道的读取端,fds[1]是管道的写入端
返回值:成功返回0,出错返回-1
头文件:#include <unistd.h>

mkfifo
函数作用:创建有名管道
函数原型:int (const char *filename, mode_t mode)
参数作用:filename:有名管道的路径,名称
  mode:管道的方式
O_NONBLOCK FIFO打开的时候非阻塞

信号处理:

常用的信号:
SIGHUP:从终端发生的结束信号
SIGINT:来自键盘的中断信号(Ctrl + C)
SIGKILL:该信号结束接收信号的进程,杀死进程
SIGTERM:kill命令发出的信号
SIGCHLD:子进程停止或结束时通知父进程
SIGSTOP:Ctrl +Z或调试程序的停止执行信号,暂停进程

kill
函数作用:传送信号给指定的进程
函数原型:int kill(pid_t pid,int sig)
函数参数:pid>0 指定的进程pid
  pid=0 发送给目前进程相同的进程组的所有进程
  pid=-1 广播给系统内所有的进程
  sig     信号
返回值:成功返回0,出错返回-1
头文件:#include <signal.h>
      #include <sys/types.h>

raise
函数功能:发送信号给自身
函数原型:int raise(int sig)
头文件:#include <signal.h>

alarm
函数作用:设置信号,传送闹钟
函数原型:unsigned int alarm(unsigned int secnds)
返回值:返回之前闹钟的剩余秒数,如果之前未设置闹钟则返回0
头文件:#include <signal.h>
      #include <unistd.h>

pause
函数作用:让进程暂停直到信号出现
函数原型:int pause(void)
返回值:-1

signal
函数作用:设置信号处理方式
函数原型:void (*signal(int signum,void(*handler(int)))(int)
typedef   void(*handler(int)  signhandler_t
signhandler_t signal(int signnum,signhandler_t handler)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值