Linux进程

进程号(PID)
标识进程的一个非负整型数。

• 父进程号(PPID)
任何进程(除init进程)都是由另一个进程创建,该进程称为被创建进程的父进程,对应的进程号称为父进程号(PPID)。

• 进程组号(PGID)
进程组是一个或多个进程的集合。他们之间相互关联,进程组可以接收同一终端的各种信号,关联的进程有一个进程组号(PGID) 。

• Linux操作系统提供了三个获得进程号的函数getpid()、getppid()、getpgid()。
需要包含头文件:
#include <sys/types.h>
#include <unistd.h>

• pid_t getpid(void) –功能:获取本进程号(PID)
• pid_t getppid(void) –功能:获取调用此函数的进程的父进程号(PPID)
• pid_t getpgid(pid_t pid) –功能:获取进程组号(PGID),参数为0时返回当前PGID,否则返回参数指定的进程的PGID

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
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 <stdio.h>
#include <sys/types.h>
#include <unistd.h>
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 <stdio.h>
#include <unistd.h>
#include <sys/types.h>
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 <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
	printf("hello\n");

	system("sl &");      //跑火车
   // system("./sys &");

	printf("done\n");
	return 0;
}

僵尸进程(Zombie Process)
进程已运行结束,但进程的占用的资源未被回收,这样的进程称为僵尸进程。
子进程已运行结束,父进程未调用wait或waitpid函数回收子进程的资源是子进程变为僵尸进程的原因。

孤儿进程(Orphan Process)
父进程运行结束,但子进程未运行结束的子进程。

守护进程(精灵进程)(Daemon process)
守护进程是个特殊的孤儿进程,这种进程脱离终端,在后台运行。

僵尸进程
僵尸进程
孤儿进程


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
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 <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
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 <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdlib.h>

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值