进程相关函数

fork

创建一个子进程,子进程复制父进程的地址空间。父进程返回子进程PID,子进程返回0。

pid_t pid = fork();
if (pid == 0) { /* 子进程代码 */ }
else { /* 父进程代码 */ }

getpid

获取当前进程的PID。

pid_t pid = getpid();

getppid

获取父进程的PID。

pid_t ppid = getppid();

wait

阻塞等待任意子进程结束,返回终止子进程的PID。

int status;
pid_t child_pid = wait(&status);

waitpid

等待指定子进程结束,可设置非阻塞选项。

int status;
pid_t child_pid = waitpid(pid, &status, WNOHANG);

exit

正常终止进程,清理I/O缓冲区。

exit(0);  // 0表示成功

_exit

立即终止进程,不清理缓冲区。

_exit(1);  // 1表示失败

作业:

1.创建一个进程扇
        父
子1    子2    子3......

#include <myhead.h>

int main(int argc, const char *argv[])
{
	pid_t pid1,pid2,pid3;

	if((pid1=fork())==0)
	{
		//sleep(1);
		puts("这是子进程1!");
	}
	else if(pid1>0)
	{
		if((pid2=fork())==0)
		{
			//sleep(2);
			puts("这是子进程2!");
		}
		else if(pid2>0)
		{
			if((pid3=fork())==0)
			{
				//sleep(3);
				puts("这是子进程3!");
			}
			else if(pid3>0)
			{
				puts("这是父进程!");
				//waitpid(pid3,NULL,0);
			}
			else
				ERROR_MSG("pid3=fork error");
		}
		else
			ERROR_MSG("pid2=fork error");
	}
	else
		ERROR_MSG("pid1=fork error");
	while(1);
	return 0;
}

运行结果:



2.创建一个进程链
父 ----  子 ----  孙  ---- 曾孙

#include <myhead.h>

int main(int argc, const char *argv[])
{
	pid_t pid1,pid2,pid3;

	if((pid1=fork())==0)
	{
		if((pid2=fork())==0)
		{
			if((pid3=fork())==0)
			{
				puts("这是曾孙进程!");
			}
			else if(pid3>0)
			{
				puts("这是孙子进程!");
			}
			else
				ERROR_MSG("pid3=fork error");
		}
		else if(pid2>0)
		{
			puts("这是子进程!");
		}
		else
			ERROR_MSG("pid2=fork error");
	}
	else if(pid1>0)
	{
		puts("这是父进程!");
		waitpid(pid3,NULL,0);

	}
	else
		ERROR_MSG("pid1=fork error");
	while(1);
	return 0;
}

运行结果:

3.牛客网

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐