linux多进程编程
来源:互联网 发布:带着淘宝混异世文汇吧 编辑:程序博客网 时间:2024/06/08 12:12
1.fork系统调用
(信号位图被清除,父进程设置的信号处理函数不再对新进程起作用--测试后,发现是错的,至少在Red Hat Enterprise Linux 6 64-bit上测试 发现父进程设置信号处理函数调用fork后,子线程有用)子进程没有继承父进程的超时设置(alarm)、文件锁、未决信号
父进程中打开的文件描述符默认在子进程中也是打开的。
2.excec系列函数
一般都是在子进程中执行以其他程序,excec函数是不返回的,除非出错返回-1.excec不会关闭原程序打开的文件描述符,除非该文件描述符上设置了类型SOCK_CLOEXEC属性。
3.处理僵尸进程
wait会阻塞进程,直到该进程的某个子进程结束为止
waitpid 中第三个参数可以设置成WNOHANG非阻塞
在收到SIGCHLD后,在信号处理函数中调用waitpid以彻底结束子进程。
4.管道只能用于有关联的两个进程(比如父子进程)通信。
pie 单向
int soketpair(int domain,int type, int protocol,int fd[2]);双向--同一端可读可写
5.ipc 信号量 http://blog.csdn.net/ta893115871/article/details/7505560
在sys/sem.h头文件中,主要包括3个系统调用:semget、semop、semctl
semget创建或者获取一个已经存在的信号量集
semop改变信号量的值,即执行获取信号量,释放信号量。
semctl允许调用者对信号量进行直接控制
nt semctl(int _semid ,int _semnum,int _cmd ……);
功能:控制信号量的信息。
返回值:成功返回0,失败返回-1;
参数:
_semid 信号量的标志码(ID),也就是semget()函数的返回值;
_semnum, 操作信号在信号集中的编号。从0开始。
_cmd 命令,表示要进行的操作。
参数cmd中可以使用的命令如下:
IPC_STAT读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。
IPC_SET设置信号量集的数据结构semid_ds中的元素ipc_perm,其值取自semun中的buf参数。
IPC_RMID将信号量集从内存中删除。
GETALL用于读取信号量集中的所有信号量的值。
GETNCNT返回正在等待资源的进程数目。
GETPID返回最后一个执行semop操作的进程的PID。
GETVAL返回信号量集中的一个单个的信号量的值。
GETZCNT返回这在等待完全空闲的资源的进程数目。
SETALL设置信号量集中的所有的信号量的值。
SETVAL设置信号量集中的一个单独的信号量的值。
例:
-1获取,1释放
void pv(int sem_id,int op)
{
struct sembuf sem_b;
sem_b.sem_num=0;
sem_b.sem_op=op;
sem_b.sem_flg=SEM_UNDO;
semop(sem_id,&sem_b,1);
}
int sem_id=semget(IPC_PRIVATE,1,0666);//生成创建,IPC_PRIVATE其值为0,不是私有的意思,其他进程也可以共享,应该是创建的意思
union semun sem_un;
sem_un.val=1;
semctl(sem_id,0,SETVAL,sem_un);//设置
pv(sem_id,-1);//获取
pv(sem_id,1);//释放
semctl(sem_id,0,IPC_RMID,sem_un);//删除
6.共享内存 http://blog.csdn.net/sunmenggmail/article/details/7565337
http://www.360doc.com/content/13/0817/11/7377734_307777806.shtml
a。shmget创建或者获取一段已经存在的共享内存
shmat把创建或者获取到的共享内存关联到进程的地址空间
shmdt与进程地址空间分离
shmct控制系统内存的某些属性
b。mmap函数:申请一段内存,用作亲缘进程间通信的匿名共享内存;也可以将普通文件或者shm_open的共享内存对象映射到其中提供任意进程间的共享内存通信
munmap 释放
c。POSIX方法:shm_open、shm_unlink函数
内部实际上是用mmap实现的在无关进程间的内存共享
编译时要指定链接选项-lrt
d.posix信号量用于线程或者进程间同步:sem_open ,sem_close,sem_post,sem_wait
http://www.cnblogs.com/BloodAndBone/archive/2011/01/18/1938552.html
e.int r = socketpair( AF_UNIX, SOCK_STREAM, 0, fd );父子进程通信
f.消息队列:每个数据都有类型,接收方可以根据类型来有选择的接收数据
msgget、msgsnd,msgrcv,msgctl
- linux多进程编程
- linux 多进程编程
- Linux多进程编程
- linux 多进程编程
- linux 多进程编程
- linux多进程编程
- linux多进程编程
- Linux多进程编程
- Linux 多进程编程
- Linux 多进程编程
- linux多进程编程
- Linux多进程编程
- Linux多进程编程 与windows进程
- linux/unix多进程编程
- 【linux】多进程、多线程编程
- Linux多进程编程讲解
- linux 多进程编程基础
- 嵌入式linux多进程编程
- 多校第4场 HDU 4902 Nice boat 线段树
- oracle 反斜杠 /
- [水]ZOJ1025
- 人有多大懒,才有多大闲 (评论『卓有成效的程序员』)
- Linux2.6.36/37下移植yaffs2
- linux多进程编程
- 2.1-链表去重
- 好代码是廉价的代码
- 三种东西永远不要放到数据库里
- fl2440 开发板环境配置(仅供个人参考,记忆力不好)
- C++设计模式-Singleton
- Java中能帮助你快速的进行添、删、查、改的SqlHelper
- for 循环为何可恨?
- Hive日志调试