进程ID—PID:
#include "head.h"int main() {pid_t pid;if ((pid = fork()) < 0) {//创建进程perror("fork()");exit(1);}//fork在没有出错的情况下有两种返回情况 在父进程中返回子进程的PID 在子进程中返回0if (pid == 0 ) {printf("I am child , pid = %d, ppid = %d \n", getpid(), getppid());//子进程} else {printf("I am father my child is %d , pid = %d, ppid = %d, \n", pid, getpid(), getppid());//父进程}return 0;
}
关于fork写拷贝机制节省资源:创建子进程时,将空间分成很多个页,如果在某页中有写操作则将该页复制进行修改。
#include "head.h"int main() {int i;pid_t pid;for (i = 1; i <= 10; ++i) {if ((pid = fork()) < 0) {perror("fork()");exit(1);}if (pid == 0) break;//如果是子进程退出for循环, 如果是父进程for循环继续}if (pid == 0) printf("i am the %dth child, pid = %d, ppid = %d \n", i, getpid(), getppid());//输出子进程信息else printf("i am the father, pid = %d, ppid = %d \n", getpid(), getppid());//输出父进程信息return 0;
}
#include "head.h"int main() {pid_t pid;if ((pid = fork()) < 0) {//创建进程perror("fork()");exit(1);}//fork在没有出错的情况下有两种返回情况 在父进程中返回子进程的PID 在子进程中返回0if (pid == 0 ) {printf("I am child , pid = %d, ppid = %d \n", getpid(), getppid());//子进程} else {wait(NULL);printf("I am father my child is %d , pid = %d, ppid = %d, \n", pid, getpid(), getppid());//父进程}return 0;
}
注:wait能够帮助父进程监控子进程的结束状态,只有子进程结束之后,父进程才会结束。
#include "head.h"int main() {int i;pid_t pid;for (i = 1; i <= 10; ++i) {sleep(1);if ((pid = fork()) < 0) {perror("fork()");exit(1);}if (pid == 0) break;//如果是子进程退出for循环, 如果是父进程for循环继续}if (pid == 0) printf("i am the %dth child, pid = %d, ppid = %d \n", i, getpid(), getppid());//输出子进程信息else {for (int k = 1; k <= 10; ++k) wait(NULL);printf("i am the father, pid = %d, ppid = %d \n", getpid(), getppid());//输出父进程信息}return 0;
}
#include "head.h"int main() {pid_t pid;if ((pid = fork()) < 0) {perror("fork()");exit(1);}if (pid == 0) {execl("/bin/cat", "cat", "2.exec.c", NULL);} else {wait(NULL);printf("i am the father!\n");}return 0;
}
#include "head.h"int main() {pid_t pid;if ((pid = fork()) < 0) {perror("fork()");exit(1);}if (pid == 0) {execl("/usr/bin/gcc", "gcc", "1.fork.c", "-I", "../common/", NULL);} else {wait(NULL);printf("i am the father!\n");}return 0;
}
注:调用execl系统调用时,原有的进程空间会被替换出去,替换成需要运行程序的进程空间(代码段部分、数据部分)。
#include "head.h"int main(int argc, char *argv[]) {if (argc == 1) {fprintf(stderr, "Usage : ./%s filename!\n", argv[0]);exit(1);}//1.打开当前文件夹opendir 读文件夹下的文件readdirint flag = 0;DIR *dirptr;dirptr = opendir(".");struct dirent *dir;while ((dir = readdir(dirptr)) != NULL) {if (!strcmp(dir->d_name, argv[1])) flag = 1;//文件存在则flag置位1}//2.如果文件不存在则新建文件 并使用vim打开进行编辑pid_t pid;if (flag == 0) {int fd;if ((fd = open(argv[1], O_RDWR | O_CREAT, 0644)) < 0) {perror("open");exit(1);}if ((pid = fork()) < 0) {perror("fork1");exit(1);}if (pid == 0) {//子进程vim打开文件并进行编辑execl("/usr/bin/vim", "vim", argv[1], NULL);}}wait(NULL);//3.编译并执行文件if ((pid = fork()) < 0) {perror("fork2-1");exit(1);}if (pid == 0) {execl("/usr/bin/gcc", "gcc", argv[1], "-o", "target.out", NULL);//编译文件} else {wait(NULL);if ((pid = fork()) < 0) {perror("fork2-2");exit(1);}if (pid == 0) {execl("./target.out", "target.out", NULL);//执行文件} else {wait(NULL);}}return 0;
}
打开文件夹中不存在的文件,自动使用vim打开,写入test1.c
自动编译并运行target.c得到结果,
进程调度器,是一个内核子系统,把有限的处理器资源分配给系统中的各个进程(决定哪个进程来运行)。