Linux进程编程
使用fork函数创建一个进程
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t pid;
pid=fork();
printf("jin cheng wei:%d\n",getpid());
if(pid>0){
printf("pid=%d shi fu jin cheng:%d\n",pid,getpid());
}else if(pid==0){
printf("shi zi jin cheng:%d\n",getpid());
}
return 0;
}
如上程序,fork会创建一个新进程,父进程也会运行子进程的程序,返回值正好是子进程的pid大于0非负数,运行子进程是返回值是0,
例:
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t pid;
int i=0;
while(1){
printf("........\n");
scanf("%d",&i);
if(i==1){
pid=fork();
if(pid>0){
}else if(pid==0){
while(1){
printf("pid=%d\n",getpid());//后面必须加\n换行符,不然显示不出来
sleep(3);
}
}
}else{
printf("*****\n");
}
}
return 0;
}
在每在父进程中输入一个一就会创建一个子进程
fork函数总结:
getpid(void)函数
函数功能区的进程识别码
getppid()获取父进程识别码
kill -9 xxxx(进程号)可以强制结束该进程
vfork函数创建进程
区别如下:
实例1:
/*当使用fork是父子进程是相互争夺的*/
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t pid;
pid=fork();
if(pid>0){
while(1){
printf("00000\n");
sleep(1);
}
}else if(pid==0){
while(1){
printf("11111\n");
sleep(1);
}
}
return 0;
}
实例2:
/*当使用vfork时如果不退出子程序就会一直运行子程序,退出的时候要用合适的指令exit,否则会破坏数据*/
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
int main(){
pid_t pid;
int i=0;
pid=vfork();
if(pid>0){
while(1){
printf("i=%d\n",i);
printf("this is father print,pid=%d\n",getpid());
sleep(1);
}
}else if(pid==0){
while(1){
printf("this is chilid print,pid=%d\n",getpid());
sleep(1);
i++;
if(i==3){
exit(0);
}
}
}
return 0;
}
进程退出:
父进程等待子进程
wait函数
例
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
int main(){
pid_t pid;
int i=0;
int j=1;
pid=fork();
if(pid>0){
wait(&j);
printf("wart=%d\n",WEXITSTATUS(j));
while(1){
printf("i=%d\n",i);
printf("this is father print,pid=%d\n",getpid());
sleep(1);
}
}else if(pid==0){
while(1){
printf("this is chilid print,pid=%d\n",getpid());
sleep(1);
i++;
if(i==3){
exit(2);
}
}
}
return 0;
}
waitpid函数
孤儿进程