进程:
1.进程的概念and创建一个进程
什么是程序?什么是进程?
程序是静态的概念,gcc xxx.c磁盘中就生成了pro文件叫做程序。进程是程序一次运行的活动。意思是程序跑起来就多了一个进程。
如何创建一个进程???
Int main()
{
pid_t pid1;
Pid_t pid2;
Pid1=getpid();
Printf(“this is pid num=%d”,pid1);
pid2=fork()
If(pid2>0){
Printf(“this is father pid %d\n”,pid2);
}else if(pid2==0){
Printf(“this is child pid %d\n”,pid2);
}else if(pid2==-1){
Printf(“print pid failed\n”);
}
}
Fork和vfork有什么区别?
关键区别1:vfork直接使用父进程存储空间,不拷贝。
关键区别2:vfork保证子进程先运行,当子进程调用exit推出后,父进程才执行。
- 进程的退出
正常退出:1.main函数调用return
2.进程调用exit(),标准c库
3.进程调用_exit()或者_Exit()属于系统调用
补充:进程最后一个线程返回;最后一个线程调用pthread_exit
异常退出:1.调用abort 2.当进程收到某些信号时,3.最后一个线程对取消请求做出响应。
程序代码:
Int main()
{
Pid_t pid;
If(pid>0){
Printf(“this is father pid\n”);
for(a=0;a++;a<10){
Printf(“%d\n”,a);
}
}else(pid<0){
for(a=0;a++;a<3){
Printf(“%d\n”,a);
}
exit(1)
}
}
父进程等待子进程退出
创建子进程的目的是为了让子进程干活儿,干活分为两种状态干完和没干完。干完程序退出exit(0or1or2)没完abort。
进程等待
为什么要等待?
- 子进程退出状态不被收集。变成僵尸进程。2.父进程等待子进程退出,并且收集子进程的状态
代码:
Int main()
{
Pid_t pid;
int cnt =0;
int status=10;
pid=fork();
if(pid>0){
wait(&status);
printf(“child quit ”);
while(1){
printf(“cnt=%d\n”,cnt);
printf(“this is father print pid=%d\n”,getpid());
Sleep(1);
}
}else if(pid==0){
while(1){
Printf(“this is child print pid=%d\n”,getpid());
Sleep(1);
cnt++;
if(cnt==5){
exit(3);
}
}
}
}
对于waitpid参数中pid参数作用如下:
Pid==-1 等待任一子进程。就这方面而言,waitpid和wait等效
Pid>0等待其进程id与pid相等的子进程
Pid==0等待其组id等于调用进程组任一子进程
Pid<-1等待其组id等于pid绝对值任一子进程
system和execl族函数
int main()
{
pid_t pid ;
Int data=10;
While(1){
Printf(“please input a data\n”);
Scanf(“%d”,&data);
If(data==1){
Int fdsrc;
Pid =fork();
If(pid>0){
Wait(NULL);
}else if(pid==0){
System(“./changedata config .text”);
}else{
Printf(“wait od nothing \n”);
}
}
}
return 0;
}
execl族函数的用法
把system()换成execl(“./changdata”,”changedta”,”config.text”,NULL)
显然execl函数有点麻烦。。。