二、多任务并发

单任务:程序运行起来,只能处理一件事情

多任务:程序运行起来,可以同时处理多件事情

3.进程间通信机制(IPC)

进程间空间独立,不能直接通信,数据共享需要使用IPC机制

进程间通信的方法:

同一主机间进程通信:

1.有名管道

2.无名管道

3.信号

4.共享内存

5.消息队列

6.信号量集

不同主机间进程通信:

1.网络套接字

2.有名管道

有名管道:同一主机,任意进程间通信。通过创建一个管道文件实现(p)。

int mkfifo(const char *pathname, mode_t mode);
功能:创建一个管道文件
参数:
	pathname:管道文件名称
	mode:管道文件的读写执行权限
返回值:
	成功:0
	失败:-1
打开管道文件:open
读写管道文件:read/write
关闭管道文件:close
3.信号

信号:进程间的通知机制(异步通信)

信号:软中断。CPU正在执行的任务可以被一个信号打断,中断后执行新的任务,新的任务结束继续执行之前的任务。

信号的操作:

1.发送信号:kill、kill()

2.注册信号:signal()

3.信号的处理方式

        忽略:不处理

        缺省:按照操作系统默认方式处理

        捕获:按照自定义方式处理

kill -l 查看
1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

	2) SIGINT:ctrl + c 
		让一个进程被打断
	3) SIGQUIT:ctrl + \
		让一个进程结束
	9) SIGKILL:
		强制让一个进程结束
	11)SIGSEGV:
		让一个进程结束(段错误)
	13)SIGPIPE:
		让一个进程结束(管道破裂)
	14)SIGALRM:
		让一个进程结束(定时时间到达)
	*17)SIGCHLD:
		子进程结束时发送给父进程(隐含的发送)
	18)SIGCONT:
		让停止态的进程继续执行
	19)SIGSTOP:
		让运行态的进程进入停止态(暂停)强制停止
	20)SIGTSTP:
		ctrl + z   让进程进入暂停态,后台进程
		来自终端的停止信号

	10 SIGUSR1
	12 SIGUSR2
	
	9	SIGKILL
	19	SIGSTOP
	不能被忽略和捕捉
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:注册一个信号
参数:
	signum : 需要注册的信号的编号
	handler:信号的处理方式
		SIG_IGN : 以忽略方式处理
		SIG_DFL :以缺省(默认)方式处理
        handler :以捕获方式处理(自定义):自定的信号任务处理函数
返回值:
	成功:返回handler
	失败:SIG_ERR

注意:
	1. 信号只需要注册一次
	2. 信号能早注册就早注册

注意:

1. 信号函数尽可能的快、短、小,尽可能避免长延时、阻塞、休眠等耗时操作
2. 使用sigaction替代signal,可以屏蔽同源信号,防止产生信号触发嵌套

pause();
功能:让一个进程挂起(休眠)
可以使用一个信号将pause唤醒,该信号必须被捕获。
unsigned int alarm(unsigned int seconds);
功能:设置一个闹钟,闹钟时间到时可以发送一个SIGALRM信号
参数:
	seconds:设置的闹钟的秒数
4.消息队列

System V提供的IPC对象,用于进程间通信。

消息队列:可以发送指定消息类型的消息,可用于设置消息的优先级

查看IPC对象的命令:
ipcs -a 查询共享内存,信号量集,消息队列
ipcrm -s 删除信号量集
	  -m 删除共享内存
	  -q 删除消息队列
ipcrm -m shmid   
ipcrm -M shmkey
ipcrm -q msgid 
ipcrm -Q msgkey

获取IPC对象key值:ftok()

key_t ftok(const char *pathname, int proj_id);
功能:获取IPC对象的key值
参数:
	pathname:路径名
	proj_id:工程id
返回值:
	成功:key值
	失败:-1

创建消息队列:msgget()

 int msgget(key_t key, int msgflg);
功能:创建消息队列并获得一个消息队列的id
参数:
	key:IPC对象key值
	msgflg:操作方式 :IPC_CREAT | 0664
返回值:
	成功:id
	失败:-1

发送消息队列:msgsnd()

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:向消息队列发送消息
参数:
	msqid:消息队列id
	msgp:发送的消息体
	msgsz:消息体中的正文大小
	msgflg:0 默认方式发送
成功:
	成功:0
	失败:-1
	
           struct msgbuf {
               long mtype;       /* message type, must be > 0 */
               char mtext[1];    /* message data */
           };

接收消息队列:msgrcv()

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
功能:从消息队列接收消息
参数:	
	msqid:消息队列id
	msgp:存放消息体的空间地址
	msgsz:消息体正文大小
	msgtyp:接收的消息类型
		0 :按顺序收
		>0 : mtype 接收指定mtype的消息
		<0 :接收<=|mtype |的消息:-100: <=100
	msgflg:0 默认方式接收
返回值:
	成功:返回实际收到的消息体正文的大小
	失败:-1

删除消息队列:msgctl()

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
功能:对消息队列执行操作
参数:
	msqid:消息队列id
	cmd:
		IPC_STAT :获取状态
		IPC_SET:设置状态
		IPC_RMID:删除
	buf :
		删除:NULL
返回值
	成功:0
	失败:-1
5.共享内存

共享内存:进程间效率最高的通信方式

原因:使用内存映射技术,减少了读写数据时反复数据拷贝带来的时间消耗。

创建共享内存:shmget

int shmget(key_t key, size_t size, int shmflg);
功能:创建共享内存并获得共享内存的id
参数:
	key:IPC对象的key值
	size:创建的共享内存的大小,向上取整到PAGE_SIZE(4096)整数倍
	shmflg: 创建方式
		IPC_CREAT | 0664
返回值:
	成功:共享内存的id
	失败:-1

建立内存映射shmat

void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:建立共享内存和用户进程空间的映射
参数:
	shmid:共享内存id
	shmaddr:映射的用户空间首地址
		NULL:由操作系统自己分配用户空间
	shmflg:对共享内存的读写可执行权限
		SHM_EXEC: 可执行权限
		SHM_RDONLY:只读权限
		!SHM_RDONLY : 读写权限
返回值:
	

解除内存映射shmdt

int shmdt(const void *shmaddr);
功能:解除共享内存和用户空间的映射关系
参数:
	shmaddr:用户空间首地址
返回值:
	成功:0
	失败:-1

删除共享内存shmctl

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:操作共享内存
参数:
	shmid:共享内存的id
	cmd:
		IPC_STAT :获取状态
		IPC_SET:设置状态
		IPC_RMID:删除
	buf :删除NULL
返回值:
	成功:0
	失败:-1
6. 信号量集

信号量数组

信号量集:实现进程间同步。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐