Linux文件,进程控制编程

本文深入探讨了Linux系统中的文件编程和进程控制概念。详细介绍了系统调用、文件类型、文件描述符、权限模式,以及进程特性、创建、运行、撤销、调度算法和ID获取。此外,还讲解了fork、vfork、execv函数和进程等待的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、文件编程

1.所谓系统调用是指操作系统提供给用户的一组"特殊"接口,用户程序可以通过这组"特殊"接口来获得操作系统内核提供的服务。

  用户进程在通常情况下不允许访问内核数据,也无法使用内核函数。

 

2.Linux文件可分为:普通文件,目录文件,链接文件,设备文件。

   一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理。

 

文件描述符

标准输入

0

STDIN_FILENO 

标准输出

1

STDOUT_FILENO 

标准出错

2

STDERR_FILENO 

 

常创建模式:

S_IRUSR     可读

S_IWUSR     可写

S_IXUSR      可执行

S_IXRWU      可读,可写,可执行

 

3.参数含义

返回值:成功返回新分配的文件描述符,

               出错返回1并设置errno;

  mode参数:

O_RDONLY         只读打开

O_WRONLY        只写打开

O_RDWR             读,写打开

 

4.库函数——创建和打开

 

 

二、进程控制编程

进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元。

进程是动态的,程序是静态的;

进程是暂时的,程序是长久的;

进程与程序组成不同;

进程与程序的对应关系。

创建:每个进程都是由其父进程创建,进程可以创建子进程,子进程又可以创建子进程的子进程;

运行:多个进程可以同时存在,进程间可以通信;

撤销:进程可以被撤销,从而结束一个进程的运行。

 

Linux系统是一个多进程的系统,它的进程之间具有并行性,互不干扰的特点。

Linux中的进程包含3个段,分别是"数据段"、"代码段"、和"堆栈段"。

"数据段"存放的是全局变量、常数以及动态数据分配的数据空间;

"代码段"存放的是程序代码的数据;

"堆栈段"存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。

 

进程ID(PID):标识进程的唯一数字

父进程的ID(PPID)

启动进程的用户ID(UID)。

 

操作系统中将一次只允许一个进程访问的资源称为临界资源;

进程中访问临界资源的那段程序代码称为临界区。

 

调度算法:

先来先服务调度算法

段进程优先调度算法

高优先级优先调度算法

时间片轮转法

 

获取ID:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
	printf("pid : %d\n", getpid());       //获得本进程ID
	printf("ppid : %d\n", getppid());     //获得父进程ID

	while (1);
	return 0;
}

 

进程创建 —— fork:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
	pid_t pid;
	int a = 0;

	pid = fork();   //创建子进程 
	if (-1 == pid)   //失败返回-1
	{
		perror("fork");
		exit(1);
	}
	else if (0 == pid)    //子进程
	{	
		a++;
		printf("Child a = %d %p\n", a, &a);
		printf("This is ChildProcess pid %d ppid %d!\n", getpid(), getppid());
		printf("%d\n", pid);
	}
	else                  //父进程
	{
		a++;
		printf("Parent a = %d %p\n", a, &a);
		printf("This is ParentProcess %d!\n", getpid());
		printf("%d\n", pid);
	}


	return 0;
}

 

进程创建 —— vfork

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
	pid_t pid;
	int a = 0;

	pid = vfork();
	if (-1 == pid)
	{
		perror("vfork");
		exit(1);
	}
	else if (0 == pid)   //子进程  子进程先运行
	{
		sleep(2);
		a++;
		printf("Child Process a = %d\n", a);
		exit(1);     //子进程指定退出方式
	}
	else      //父进程
	{
		a++;
		printf("Parent Process a = %d!\n", a);
	}
	return 0;
}

 

execv函数:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
	pid_t pid;
	char *argv[] = {"./test", "hello", "world", "123", NULL};

	pid = vfork();
	if (-1 == pid)
	{
		perror("vfork");
		exit(1);
	}
	else if (0 == pid)
	{
		execv("/home/163/Linux/Process/test", argv);
		sleep(2);
	}
	else
	{
		printf("This is Parent Process %d!\n", getpid());
	}
	return 0;
}

 

进程等待:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
	pid_t pid;

	pid = fork();   //创建子进程 
	if (-1 == pid)   //失败返回-1
	{
		perror("fork");
		exit(1);
	}
	else if (0 == pid)    //子进程
	{	
		sleep(1);
		printf("This is ChildProcess pid!\n");
		exit(100);
	}
	else                  //父进程
	{
		int status;
		printf("This is ParentProcess!\n");
		//wait(&status);  //1、等待子进程结束(阻塞)   2、回收子进程资源
		waitpid(pid, &status, 0);
		if (WIFEXITED(status))    //判断子进程是否正常退出
		{
			printf("Child Exit Normally! %d\n", WEXITSTATUS(status));  //获取子进程退出状态
		}
	}


	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值