进程控制编程

来源:互联网 发布:网络工程部经理招聘 编辑:程序博客网 时间:2024/06/06 14:19

进程的生命周期:

创建:   每个进程都是由其父进程创建,进程可以创建子进程,子进程又可以创建子进程的子进程
运行:   多个进程可以同时存在,进程间可以通信
撤销:    进程可以被撤销,从而结束一个进程的运行


进程的状态:

执行状态:进程正在占用CPU
就绪状态:进程已具备一切条件,正在等待分配CPU的处理时间片
等待状态:进程不能使用CPU,若等待事件发生则可将其唤醒


Linux下进程地址空间:

Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。
“数据段”存放的是全局变量、常数以及动态数据分配的数据空间;
“代码段”存放的是程序代码的数据。
“堆栈段”存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。 


死锁:

多个进程因竞争资源而形成一种僵局,若无外力作用,这些进程都将永远不能再向前推进


获取ID:

#include <sys/types.h> 
#include <unistd.h>
pid_t getpid(void)     获取本进程ID。
pid_t getppid(void)        获取父进程ID

例:getpid.c (演示)
#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的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:

0:  子进程
子进程ID(大于0):父进程
-1: 出错


例:

#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
/*此时仅有一个进程*/
pid=fork();


              /*此时已经有两个进程在同时运行*/
if(pid<0)
printf("error in fork!");
else if(pid==0)
printf("I am the child process, ID is %d\n",getpid());
else
printf("I am the parent process,ID is %d\n",getpid());
}


进程创建vfork:

#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void)

功能:创建子进程


表头文件: #include<unistd.h> 定义函数: pid_t vfork(void); 函数说明:
vfork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文件代码、工作目录和资源限制等。
子进程不会继承父进程的文件锁定和未处理的信号。
注意,Linux不保证子进程会比父进程先执行或晚执行,因此编写程序时要留意死锁或竞争条件的发生。


fork和vfork区别:

1.   fork:子进程拷贝父进程的数据段
      vfork:子进程与父进程共享数据段


2.   fork:父、子进程的执行次序不确定
  vfork:子进程先运行,父进程后运行



exec函数族:

exec用被执行的程序替换调用它的程序。
区别:
fork创建一个新的进程,产生一个新的PID。

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


#include<unistd.h>
int execl(const char * path,const char * arg1, ...)
参数:
path:被执行程序名(含完整路径)。
arg1 – argn: 被执行程序所需的命令行参数,含程序名。以空指针(NULL)结束。


#include<unistd.h>
int execv (const char * path, char * const argv[ ])
参数:
path:被执行程序名(含完整路径)。

argv[]: 被执行程序所需的命令行参数数组。


pid_t wait (int * status)
功能:阻塞该进程,直到其某个子进程退出。


#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid (pid_t pid, int * status, int options)
功能:
会暂时停止目前进程的执行,直到有信号来到或子进程结束

例:

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int status;
pid=fork();
if(pid==-1)
{
perror("fork");
exit(1);
}
else if(0==pid)
{
printf("Child Process\n");
exit(6);
}
else
{
sleep(2);
printf("Parent Process\n");
wait(&status);
if(WIFEXITED(status))
{
printf("Exit Normally\n");
}
}
return 0;
}



kill:

#include<stdio.h>
#include <sys/types.h>
#include <signal.h>
#include<stdlib.h>
int main()
{
pid_t pid;
pid=fork();
if(-1==pid)
{
perror("fork");
exit(1);


}
else if(0==pid)
{
sleep(2);
}
else
{
kill(pid,7);
waitpid(pid,NULL,0);
}
return 0;
}



原创粉丝点击