天天看点

Linux操作系统入门-进程管理2.进程杀死函数kill()3.POSIX 下进程控制的实验程序

头文件: #include<unistd.h>

#include<sys/types.h>

1.进程创建函数fork()

函数原型:

pid_t  fork( void); (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)

函数说明:

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。 子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。

注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。

返回值: 由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。

因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的

a. 在父进程中,fork返回新创建子进程的进程ID; b. 在子进程中,fork返回0; c .如果出现错误,fork返回一个负值。 在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。

我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

# include<stdio.h>
# include<unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <ctype.h>
int main()
{
/*当前进程,即主进程*/
printf("now %d\n",getpid());
pid_t m=fork();
/*通过函数返回值不同,判断进程是子进程还是父进程,然后进入不同代码段*/
 if(m>0)
{
printf("father,the main progress   %d\n",getpid());
wait();// 父进程等待子进程
}
else if(m==0)
{
/*getpid()获得当前进程的PID;
*getppid()获得当前进程的父进程PID;
*/ 
printf("son,%d\n",getpid());
 printf("father,%d\n",getppid());
}
}
           

运行结果:

now 3221

father,the main progress   3221

son,3222

father,3221

test ,3222

test ,3221

2.进程杀死函数kill()

函数原型:

int kill(pid_t pid,int sig);

函数说明: kill()可以用来送参数sig指定的信号给参数pid指定的进程

参数:

参数pid有几种情况: pid>0 将信号传给进程识别码为pid 的进程。 pid=0 将信号传给和当前进程相同进程组的所有进程 pid=-1 将信号广播传送给系统内所有的进程 pid<0 将信号传给进程组识别码为pid绝对值的所有进程

参数sig有几种情况:(31个常规信号,32个扩展信号)

可以使用命令 kill -l 

$ kill -l
1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     ......      

返回值:

返回0,表示杀死进程成功;

返回-1,表示杀死进程失败。

#include<stdio.h>
# include<unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <ctype.h>
int main()
{
pid_t m=fork();
if(m==0)
{
printf("the pid is:%d\n",getpid());
int i=kill(getpid(),SIGKILL);
if(i==0)
printf("kill success\n");
else if(i==-1)
printf("kill error\n");
else 
printf("ssd\n");
}
else if(m>0)
{
 printf("main\n");
 wait();
}
return;
}
           

运行结果:

main
the pid is:3588
           

3.POSIX 下进程控制的实验程序

#include <stdio.h> 
#include <sys/types.h>
#include <unistd.h> 
#include <signal.h>
#include <ctype.h> 
/* 允许建立的子进程个数最大值 */
#define MAX_CHILD_NUMBER 10 
/* 子进程睡眠时间 */
#define SLEEP_INTERVAL 2 
int proc_number=0; /* 子进程的自编号,从0开始 */
void do_something(); 
main(int argc, char* argv[])
{ 
int child_proc_number = MAX_CHILD_NUMBER; /* 子进程个数 */
int i, ch; 
pid_t child_pid; 
pid_t pid[10]={0}; /* 存放每个子进程的id */ 
if (argc > 1)
{ 
/* 命令行参数中的第一个参数表示建立几个子进程,最多10个 */ 
child_proc_number = atoi(argv[1]); 
child_proc_number
= (child_proc_number > 10) ? 10 : child_proc_number;
} 
for (i=0; i<child_proc_number; i++)
{ 
/* 在这里填写代码,建立child_proc_number个子进程
* 子进程要执行
* proc_number = i; 
* do_something();
* 父进程把子进程的id保存到pid[i] */
child_pid=fork();
if(child_pid==0)
{
proc_number=i;
do_something();
}
else if(child_pid>0)
   pid[i]=child_pid;
else 
 printf("error\n");
}
/* 让用户选择杀死哪个进程。输入数字(自编号)表示杀死该进程
* 输入q退出 */
while ((ch = getchar()) != 'q')
{ 
if (isdigit(ch)) 
{ 
/* 在这里填写代码,向pid[ch-'0']发信号SIGTERM, 
* 杀死该子进程 */ 
if(ch-'0'<child_proc_number)
{
i=kill(pid[ch-'0'],SIGKILL);
if(i==0)
printf("kill success\n");
else if(i==-1)
printf("kill error\n");
}
else 
  printf("the main process don`t have this child\n");
} 
}
/* 在这里填写代码,杀死本组的所有进程 */ 
kill(0,SIGTERM);
return;
} 
void do_something()
{ 

printf("the father pid is :%d\n",getppid());
for(;;)
{ 
/* 打印子进程自编号。为清晰,在每个号码前加“号码+3”个空格
* 比如号码是1,就打印" 1" */
printf("This is process No.%*d\n",
proc_number+3, 
proc_number); 
sleep(2); /* 主动阻塞两秒钟 */
} 
} 
           

继续阅读