一、文件编程
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;
}