济宁那家做网站最好,黄页88网推广服务,平板电脑做网站吗,wordpress前端登录按钮信号量#xff08;信号灯集#xff09;
1 信号灯集主要完成进程间同步工作#xff0c;将多个信号灯#xff0c;放在一个信号灯集中#xff0c;每个信号灯控制一个进程
2 每个灯维护了一个value值#xff0c;当value值等于0时#xff0c;申请该资源的进程处于阻…信号量信号灯集
1 信号灯集主要完成进程间同步工作将多个信号灯放在一个信号灯集中每个信号灯控制一个进程
2 每个灯维护了一个value值当value值等于0时申请该资源的进程处于阻塞状态直到其他进程将该灯中维护的value值增加到大于0 有关信号灯集的API
创建key值
#include sys/types.h
#include sys/ipc.h
key_t ftok(const char *pathname, int proj_id);
创建信号灯集
#include sys/types.h
#include sys/ipc.h
#include sys/sem.h
int semget(key_t key, int nsems, int semflg);
信号灯集控制函数
#include sys/types.h
#include sys/ipc.h
#include sys/sem.h
int semctl(int semid, int semnum, int cmd, ...);
申请和释放信号灯的资源函数
#include sys/types.h
#include sys/ipc.h
#include sys/sem.h
int semop(int semid, struct sembuf *sops, size_t nsops); 库的概念
库在系统中是一个二进制文件他是由XXX.c不包含main函数的原文件编译而来其他程序要使用该源文件中的函数时只需要在编译时链接上该库即可无需使用该源文件进行联合编译。这样可以保证知识产权的安全性。
库分为静态库和动态库在不同的操作系统中静态库和动态库的格式不同
在windows下
静态库XXX.lib
动态库:XXX.dll
在linux下
静态库libXXX.a
动态库libXXX.so
静态库
概念
静态库是由XXX.c不包含main的源文件编译生成的一个名为 libXXX.a 的二进制文件当需要使用该源文件中的相关函数时只需在编译时链接上该库无需使用源文件进行联合编译也能生成可执行程序。
静态体现在当编译生成可执行程序时会将静态库整体全部放入可执行程序中也就是每个可执行程序都完整拥有静态库。使用库中函数时无需到其他地方找函数实现直接使用即可。效率较高但是可执行程序体积较大
静态库的制作
准备程序代码 test.h #ifndef __TEST_H__ #define __TEST_H__ int sum(int m, int n); #endif test.c int sum(int m, int n) { return mn; } main.c #includemyhead.h #includetest.h int main(int argc, const char *argv[]) { printf(sum %d\n, sum(3,7)); //10 return 0; } 静态库的制作 gcc -c test.c -o test.o //只编译不链接生成二进制文件 ar -crs libtest.a test.o //依赖于二进制文件生成静态库 如果使用多个二进制文件生成一个静态库 ar -crs libtest.a test.o test1.o test2.o ... ar:用于创建或操作静态库 c:创建静态库 r:替换或覆盖库中同名文件 s:重置静态库 使用静态库 gcc 主程序.c -L 库的路径 -l库名 -I头文件路径 例如gcc main.c -L . -ltest -I . 动态库
概念
动态库是由XXX.c不包含main的源文件编译生成的一个名为 libXXX.so 的二进制文件当需要使用该源文件中的相关函数时只需在编译时链接上该库无需使用源文件进行联合编译也能生成可执行程序。
动态体现在当编译生成可执行程序时会将动态库中的函数索引编译到可执行程序中当使用该库中的函数时需要通过索引找到动态库所在的位置然后调用该库中的函数。多个可执行程序可以共享同一个动态库所以动态库也叫共享库。效率较低单可执行程序体积较小。
动态库的制作
准备文件 test.h #ifndef __TEST_H__ #define __TEST_H__ int sum(int m, int n); #endif test.c int sum(int m, int n) { return mn; } main.c #includemyhead.h #includetest.h int main(int argc, const char *argv[]) { printf(sum %d\n, sum(3,7)); //10 return 0; } 生成动态库 gcc -fPIC -c test.c -o test.o //-fPIC忽略文件位置将test.c只编译不链接生成test.o gcc -shared test.o -o libtest.so //生成动态库 gcc -shared test.o test1.o test2.o -o libtest.so //多个.o文件共同生成一个动态库 也可以将上述两条指令合成一条 gcc -fPIC -shared test.c -o libtest.so 使用动态库 gcc 主程序.c -L 库的路径 -l库名 -I 头文件路径 例如gcc main.c -L . -ltest -I .