linux多进程编程

68 篇文章 0 订阅
15 篇文章 0 订阅

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux多进程编程是指在Linux操作系统下,使用多个进程同时执行任务的编程方式。 在Linux中,每个进程都是一个独立的执行环境,有自己独立的地址空间和资源。多进程编程可以通过创建多个进程来同时执行不同的任务,从而提高程序的并发性和效率。 在Linux中,可以使用fork()系统调用创建一个新的进程。原有进程称为父进程,新创建的进程称为子进程,父进程和子进程具有相同的代码段和数据段,但拥有不同的进程ID。 通过fork()创建的进程在执行时,会复制父进程的所有资源,包括打开的文件、文件描述符等。子进程独立于父进程运行,并且可以通过exec()系列函数来加载新的程序,替代原有的代码段和数据段,实现不同的任务。 多进程编程可以通过父子进程间的通信来实现数据交换。常用的通信方式包括管道、共享内存、信号和套接字等。父进程可以通过管道或共享内存将数据传递给子进程,子进程可以通过套接字与其他进程进行通信,实现进程间的数据共享和同步。 多进程编程也需要注意避免进程之间的竞争条件和死锁。可以使用进程同步机制,如互斥锁和信号量,来保证多个进程对共享资源的互斥访问和同步执行。 总而言之,Linux多进程编程是一种有效利用多核处理器和提高程序并发性的编程方式,可以通过创建多个进程来同时执行不同的任务,并通过不同的进程间通信方式来实现数据交换和同步执行。 ### 回答2: Linux多进程编程是指在Linux操作系统上使用多个进程同时执行任务的编程方式。 Linux作为一个多用户、多任务的操作系统,支持多进程的并行执行。多进程编程可以充分利用操作系统提供的资源管理和调度机制,实现并发性和并行性。 在Linux中,一个程序可以通过创建新的进程来执行不同的任务。多进程编程可以通过调用系统调用fork()创建新的进程,从而将任务分配给不同的进程执行。同时,通过调用系统调用exec()可以在子进程中加载新的程序代码,实现任务的切换和执行。 多进程编程可以实现任务的分割和并行化处理,提高了程序的执行效率和响应速度。不同的进程之间可以通过进程间通信(IPC)机制来进行数据的交换和协调,如管道、信号、共享内存等。 在多进程编程中,需要注意进程的创建和销毁、进程间通信的机制、进程间的同步与互斥等问题。合理使用多进程编程可以更好地利用多核处理器的计算能力和资源,提高程序的并发性和性能。 总之,Linux多进程编程是一种高效利用操作系统资源的编程方式,可以实现任务的并行处理,提高程序的执行效率和响应速度。 ### 回答3: Linux多进程编程是指在Linux操作系统上使用多个进程进行编程的一种方法。在Linux下,可以创建多个进程来同时执行不同的任务,扩展系统的处理能力,提高整体的效率和响应速度。 多进程编程的主要特点是可以实现并发执行,每个进程独立运行,相互之间不会相互干扰。在Linux中,可以使用fork()系统调用来创建新的进程,子进程的运行和父进程是并行的。子进程可以继承父进程的资源,如打开的文件描述符、信号处理等,也可以通过exec()系列系统调用来加载新的程序,实现进程的替换。 在多进程编程中,进程之间可以通过进程间通信(IPC)方式进行数据交换和同步。常用的IPC机制有管道、共享内存、消息队列和信号量等。这些机制可以让多个进程之间传递数据、共享资源,实现各个进程之间的协作和通信。 多进程编程还可以通过进程管理和调度来控制各个进程的执行顺序和优先级,提高系统的整体性能。Linux提供了丰富的进程管理工具和调度算法,可以根据实际需求进行调整和配置,以达到最佳的性能和资源利用率。 总之,Linux多进程编程是一种高效的编程模式,可以充分利用多核处理器的优势,实现并发执行和资源共享。它不仅可以提高系统的处理能力和响应速度,还可以提高系统的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值