为什么使用信号量代替全局变量【进程通信】

在多任务操作系统或大型工程项目中,建议用信号量和消息队列进行进程间通信,而非过多使用全局变量。使用全局变量会增加耦合度、影响封装性等,而信号量可避免这些问题,还能阻塞任务。不过小型项目可使用全局变量,要依场景选择。

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

在多任务的操作系统或者大型的工程项目中,尽量不使用过多的全局变量,而是使用信号量和消息队列等方式来进行进程间通信。

使用信号量代替全局变量有以下原因:

  • 使用全局变量会增加耦合度,降低内聚性,不符合软件设计思想
  • 信号量其实就是把全局变量维护到了一个全局数据结构内
  • 使用全局变量影响封装性,移植性和可读性
  • 使用全局变量会严重降低代码可维护性和稳定性(想象一下维护一个前人留下来的七八百行全局变量会是多么恶心的一件事)
  • 信号量和消息队列等可以将任务阻塞,避免抢占CPU(这在RTOS中尤为重要)

但如果是小型项目的话也可以使用全局变量,因为全局变量的同步操作简单,内存地址固定,读写效率高,所以要根据不同的应用场景选择不同的方案。

### Linux 系统调用概述 在Linux操作系统中,进程管理网络通信是两个重要的方面。为了实现这些功能,内核提供了一系列系统调用来支持程序开发人员的需求。 #### 发送信号函数 `kill` `kill` 函数用于向指定的进程或进程组发送一个信号。这可以用来请求终止某个进程、暂停其运行或是触发其他类型的处理动作。具体来说: ```c #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); ``` 此函数接受两个参数:目标进程ID (`pid`) 和要传递给该进程的信号编号 (`sig`) [^3]。当成功执行时返回0;若有错误发生,则会返回-1并将 errno 设置为相应的错误码。 #### 退出进程函数 `exit` 虽然看起来像是直接操作系统的指令,但实际上 `exit()` 是由 C 库提供的标准库函数而非真正的系统调用。它负责清理当前线程并结束整个应用程序的执行流程。使用方法如下所示: ```c #include <stdlib.h> void exit(int status); ``` 通过传入的状态码(`status`) 可以让父进程了解到子进程中止的原因 [^2]。需要注意的是,在多线程环境中应当优先考虑 pthread_exit 或者 _Exit 来代替普通的 exit 调用以确保安全地关闭所有资源。 #### 启动新程序函数族 `exec*` 启动新的可执行文件通常涉及到 exec 家族的一系列变体——如 execl(), execv() 等等。这类函数允许替换掉现有进程映像而无需创建额外的新进程实例。下面是一个简单的例子展示如何利用其中一种形式来加载另一个二进制文件作为当前进程继续运行下去: ```c #include <unistd.h> extern char **environ; // 使用 argv[] 数组的形式调用命令及其参数列表 int execve(const char *path, char *const argv[], char *const envp[]); ``` 这里 path 表示待执行文件路径名字符串;argv 则是指向各个命令行参数组成的数组指针;envp 参数则指向环境变量表项地址序列 [^4]。一旦调用了任何一个 exec 版本之后就不会再回到原来的代码位置除非遇到错误情况才会失败返回 -1 并设置全局变量 errno 的值。 #### 建立套接字连接函数 `socket` 对于网络编程而言,建立客户端服务器模型的第一步就是构建好两端之间交流所必需的基础结构即所谓的 "sockets". 创建一个新的未命名 socket 描述符可通过下列方式完成: ```c #include <sys/socket.h> int socket(int domain, int type, int protocol); ``` 上述声明表明了三个必要输入量分别是协议簇 (domain),服务模式(type)以及具体的传输层协议(protocol)[^5]. 成功情况下将会得到非负整数表示新建好的句柄号;反之如果出现问题也会给出相应提示(-1).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值