进程号(PID)
标识进程的一个非负整型数。
• 父进程号(PPID)
任何进程(除init进程)都是由另一个进程创建,该进程称为被创建进程的父进程,对应的进程号称为父进程号(PPID)。
• 进程组号(PGID)
进程组是一个或多个进程的集合。他们之间相互关联,进程组可以接收同一终端的各种信号,关联的进程有一个进程组号(PGID) 。
• Linux操作系统提供了三个获得进程号的函数getpid()、getppid()、getpgid()。
需要包含头文件:
#include
#include
• pid_t getpid(void) –功能:获取本进程号(PID)
• pid_t getppid(void) –功能:获取调用此函数的进程的父进程号(PPID)
• pid_t getpgid(pid_t pid) –功能:获取进程组号(PGID),参数为0时返回当前PGID,否则返回参数指定的进程的PGID
#include
#include
#include
int main()
{
pid_t pid,ppid,pgid;
pid = getpid();
ppid = getppid();
pgid = getpgid(0);
printf("pid = %d,ppid = %d,pgid = %d\n",pid,ppid,pgid);
return 0;
}
• fork函数:创建一个新进程
pid_t fork(void)
功能: fork()函数用于从一个已存在的进程中创建一个新进程,新进程称为子进程,原进程称为父进程。
#include
#include
#include
int main()
{
pid_t pid;
pid = fork();
if(pid < 0)
{
return 0;
}
else if(pid == 0)
{
int i = 0;
for(i = 0; i < 10;i++)
{
printf("child process:%d\n",i);
sleep(1);
}
}
else
{
int j = 10;
for(j = 10 ;j > 0;j--)
{
printf("parent process:%d\n",j);
sleep(1);
}
}
}
#include
#include
#include
int main ()
{
int number = 10;
pid_t pid;
pid = fork();
if(pid < 0)
{
return 0;
}
else if(0 == pid)
{
sleep(1);
number++;
printf("child process : number + %d\n",number); //输出11
printf("%p\n,&number);
}
else
{
number--;
number--;
printf("parent process :number = %d\n",number); //输出8
printf("%p\n",&number);
}
}
}
system也可以创建进程
#include
#include
#include
int main()
{
printf("hello\n");
system("sl &"); //跑火车
// system("./sys &");
printf("done\n");
return 0;
}
僵尸进程(Zombie Process)
进程已运行结束,但进程的占用的资源未被回收,这样的进程称为僵尸进程。
子进程已运行结束,父进程未调用wait或waitpid函数回收子进程的资源是子进程变为僵尸进程的原因。
孤儿进程(Orphan Process)
父进程运行结束,但子进程未运行结束的子进程。
守护进程(精灵进程)(Daemon process)
守护进程是个特殊的孤儿进程,这种进程脱离终端,在后台运行。
#include
#include
#include
int main()
{
pid_t pid;
pid = fork();
if(pid < 0)
{
return 0;
}
else if(pid == 0)
{
printf("child process:%d %d\n",getpid(),getppid());
sleep(4);
printf("child process:%d %d\n",getpid(),getppid());
}
else
{
printf("parent process:%d %d\n",getpid(),getppid());
sleep(2);
return 0;
}
}
进程睡眠排序
#include
#include
#include
#include
int main()
{
pid_t pid;
int i ;
int a[10] = {1,2,9,10,8,7,6,5,4,3};
for( i = 0; i < 10; i++)
{
pid = fork();
if(pid < 0)
{
return 0;
}
else if( pid == 0 )
{
sleep(a[i]);
printf("child process: %d\n",a[i]);
exit(0);
}
}
printf("parent process: %d\n",getpid());
return 0;
}
守护进程
#include
#include
#include
#include
#include
#include
int main()
{
//1 orphan
pid_t pid;
pid = fork();
if(pid < 0)
{
return 0;
}
else if(pid > 0)
{ //parent
exit(0);
}
//2 setsid
setsid();
//3 chdir
chdir("/");
//4
umask(0);
//5
int i;
for(i = 0;i < 1024; i++)
{
close(i);
}
//.........................................//
int fd = open("/tmp/log.txt",O_RDWR | O_TRUNC | O_CREAT,0666);
if(fd < 0)
{
exit(0);
}
else
{
while(1)
{
write(fd,"deamon is running ...\n",22);
sleep(3);
}
}
return 0;
}