进程

进程

fork

可以通过fork产生新的进程。有三个返回值,=0为子进程,>0为父进程(为子进程ID),小于0产生错误。数据、堆、栈有两份,代码仍然为一份。系统一般优化为写时复制技术进行优化。

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

int main(int argc, char* argv[])

{

 fork();

 fork() && fork() || fork();

 fork();

 

 printf("+mypid is %d\n", getpid());

 return 0;

}

 

 

 

很明显fork() &&fork() || fork()创建了4个新进程

总结:

第一注释行的fork生成1个新进程

第二注释行的三个fork生成4+4=8个新进程

第三注释行的ork会生成10个新进程(这是因为前面总共有10个进程,调用一次fork生成10个新进程)

所以一共会生成1+8+10=19个新进程

为了便于理解,实际可以抽象为一个函数:

F(x+1)=f(x)+f(x)*Xinzeng

原则上父进程需要等待所有子进程退出,避免子进程成为孤儿进程。尽管等一会儿会被init进程接收,但是等待会加快回收资源,尤其PCB的回收。

阻塞式等待:(父进程是收到了SIGCHLD信号

pid_t wait(int* status);

头文件: 
#include<sys/types.h> 
#include<sys/wait.h>

非阻塞式等待:

pid_t waitpid( pid_t pid, int *status ,int options);

如果options设置为0,那么這个函数就是阻塞式等待,如果设置optionsWNOHANGwaitpid发现没有已经退出的子进程可以收集,就返回0。這就是非阻塞式等待。

Deamon进程编写可以使用fork,大于0的分支可以直接退出。使脱离shell来实现。

exec*

(1) exec是直接用新的进程去代替原来的程序运行,运行完毕之后不回到原先的程序中去。
(2) system是调用shell执行你的命令,system=fork+exec+waitpid,执行完毕之后,回到原先的程序中去。继续执行下面的部分。
总之,如果你用exec调用,首先应该fork一个新的进程,然后exec. system不需要你fork新进程,已经封装好了。

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

#include<sys/types.h>

#include<sys/wait.h>

int main()

{

int childpid;

int i;

 

if (fork() == 0){

    //child process

    char * execv_str[] = {"echo", "executed by execv",NULL};

    if (execv("/bin/echo",execv_str) <0 ){

        perror("error on exec");

        return 0;

    }

   printf("son proc\n");//由于执行execv 进行了进程替换,不会打印行

}else{

    //parent process

    wait(&childpid);

    printf("execv done\n\n");

}

return 0;

}

 

-----------------------------------------进程互斥---------------------------------

转自:https://blog.csdn.net/u011244446/article/details/47313963

进程间共享数据的保护,需要进程互斥锁。与线程锁不同,进程锁并没有直接的C库支持,但是在Linux平台,要实现进程之间互斥锁,方法有很多,大家不妨回忆一下你所了解的。下面就是标准C库提供的一系列方案。

System V信号量

  1. int semget(key_t key, int nsems, int semflg);  
  2. int semctl(int semid, int semnum, int cmd, ...);  
  3. int semop(int semid, struct sembuf *sops, unsigned nsops);  
  4. int semtimedop(int semid, struct sembuf *sops, unsigned nsops, struct timespec *timeout);  

与多线程环境不一样的是,在多进程环境中,一个进程的异常退出不会影响其他进程,但是如果使用了进程互斥锁呢?假如一个进程获取了互斥锁,但是在访问互斥资源的代码中crash了,或者遇到信号退出了,那么其他等待同一个锁的进程(内部某个线程)就挂死了。在多线程环境中,程序异常整个进程退出,不需要考虑异常时锁的释放,多进程环境则是一个实实在在的问题。

System V信号量通过UNDO方式可以解决该问题。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值