linux_c 网络开发日记(4)多进程程序设计

获取ID

#include<sys/types.h>

#include<unsstd.h>

pid_t getpid(void)

获取本进程ID

pid_t gettppid(void)

获取父进程ID

eg:


#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>


int main (void)

{

printf("PID = %d\n", getpid());

printf("PPID = %d\n",getppid());

return 0;

}


#include<unistd.h>

pid_t fork(void)

功能:创建子进程

fork 的奇妙之处在于它被调用一次,却返回两次,有三种不同的返回值:

1、在父进程中,fork返回新创建的子进程的PID;

2、在子进程中,fork返回0

3、如果出现错误,fork返回一个负值


创建进程-fork

eg

#include<sys/types.h>

#include<unistd.h>

int main (void)

{

pid_t pid;

pid = fork();

if(pid<0)

printf("error in fork!%d\n",fork);


else if(pid==0)

printf("i am the child process,id=%d\n",getpid());

else

printf("i am the parent process,id is %d\n",getppid());

}

pid=fork()之前,只有一个程序在执行,但在执行了这句话之后,就变成了两个进程在执行了,这两个进程共享代码段,将要执行的吓一跳语句都是ifpid==0.两个进程中,原来就存在的那个进程就被称为父进程,出现新的那个被称为子进程,父子进程区别于进程标志符(PID)不同。

eg:

#include<stdio.h>

#include(unistd.h)


int main(void)

{

pid_t pid;

int count=0;

pid = fork();

count++;

printf("count=%d\n",count);

return 0;

}


运行结果:count = 1

count = 1


子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享,在子进程中对count进行+1操作,并没有影响父进程的count值,父进程的count值仍未0.


创建vfork

#include <sys/tppes.h>

#include<unistd.h>

pid_t vfork(void)

功能:创建子进程。


区别:


1fork:子进程拷贝父进程的数据段。

   vfork:子进程与父进程共享数据段


2fork:父、子进程执行次序不确定

   vfork:子进程先运行,父进程后运行


exec函数族

exec用被执行的程序替换调用它的程序。

区别:

fork创建一个新的进程,产生新的PID

exec启动一个新程序,替换原有的进程,因此进程PID不会改变。


#include<unistd.h>

int execlconst char *path,const char * arg1,...

参数:

path:被执行程序名(含完整路径)

arg1-argn:被执行程序所需的命令行参数,含程序名,以空指针NULL结束


eg:

#include<inistd.h>


int main(void)

{

execl("/bin/ls","ls","-al","/etc/passwd",(char *)0");

}


执行效果和 ls -al /etc/passwd  一样

int  execlp(const char*path,const cahr * arg1,...)

参数:

arg1-argn:被执行程序所需的命令行参数,含程序名,以空指针NULL结束

path:被执行程序名(不含路径,将从path环境变量中查找改程序




int execv(const char * pathchar  *const argv[])


参数;

path:被执行程序名(含路径)

argv[]:所需命令行参数组。


#include <stdlib.h>

int system(const char*string)

功能:调用fork产生子进程,由子进程调用/bin/sh -c string 来执行string所代表的命令。

egsystem.c


#include<stdlib.h>

int  main(void)

{

system("ls -al /etc/pawwsd");

}


进程等待

#include<sys/types.h>

#include<sys/wait.h>


pid_ wait(int status)


功能:阻塞该进程,直到其某个子进程退出。

eg:

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <math.h>


/*

 * 

 * */

int main(void)

{

pid_t child;


/* 创建子进程*/

if((child=fork())==-1)

{

printf("Fork Error : %s\n", strerror(errno));

exit(1);

}

else 

{

if(child==0) // 子进程

{

printf("the child process is run\n");

sleep(1);  //子进程睡眠一秒,但并没有去运行父进程

printf("I am the child: %d\n", getpid());

exit(0);

}

else        //父进程

{

wait(NULL); //等到子进程退出,父进程才会运行

printf("the father process is run\n");

printf("I am the father:%d\n",getpid());

return 0;

}

}

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章