- 一、进程的创建(实例:读写鼠标键盘)
- 二、exec函数族
- 2.1 execl
- 2.1.1 demo.c
- 2.1.2 execl.c
- 2.2 execv
- 2.3 execlp
- 2.4 execvpe
- 2.4.1 demo.c
- 2.4.2 execvpe
- 三、vfork、system
- 3.1 vfok
- 3.2 system
#include#include #include #include #include #include #include int main(int argc, char const *argv[]) { pid_t pid; pid = fork(); if (pid < 0) { perror("fork error!"); exit(1); } if (pid > 0) { int fd = open("/dev/input/mouse0", O_RDWR); int cor = 0; while (1) { read(fd, &cor, sizeof(cor)); //sleep(1); printf("cor = %dn", cor); } } if (pid == 0) { char buffer[1024]; while (1) { memset(buffer, 0, sizeof(buffer)); int n_r = read(0, buffer, sizeof(buffer) - 1); buffer[n_r] = ' '; printf("buffer = %sn", buffer); } } return 0; }
同一文件,进程的读写位置不同,读写位置不被共享
如果在创建进程前,打开文件,则读写位置被共享
2.1 execl在一个进程中调用里一个程序
调用之后,原文件下面的程序会被覆盖,不予执行
要以NULL结尾
int execl (const char *path, const char *arg, ..);
2.1.1 demo.cdemo
#include2.1.2 execl.c#include #include int main(int argc, char const *argv[]) { for (size_t i = 0; i < argc; i++) { printf("argc[%ld] = %sn", i, argv[i]); } pid_t pid = getpid(); pid_t ppid = getppid(); printf("pid = %dn",pid); printf("ppid = %dn",ppid); char buffer[1024]; int n_r = read(0, buffer, sizeof(1024) - 1); buffer[n_r] = ' '; printf("buffer = %sn", buffer); return 0; }
#include2.2 execv#include #include int main(int argc, char const *argv[]) { printf("hello worldn"); execl("./demo","./demo","xasxa","hahaha",NULL); printf("快乐暑假n"); }
int execv (const char *path, char *const argv[]);
#include2.3 execlp#include #include int main(int argc, char const *argv[]) { printf("hello worldn"); //execl("./demo","./demo","xasxa","hahaha",NULL); char *arg[] = {"./demo", "hello1", "hello2", NULL}; execv("./demo", arg); printf("快乐暑假n"); }
int execIp (const char *file, const char *arg,...)
#include2.4 execvpe#include #include int main(int argc, char const *argv[]) { printf("hello worldn"); //execl("./demo","./demo","xasxa","hahaha",NULL); //char *arg[] = {"./demo", "hello1", "hello2", NULL}; //execv("./demo", arg); execlp("/home/jsetc/2022.7c++/多进程/demo","./demo","world1","world2",NULL); printf("快乐暑假n"); }
int execvpe (const char *file, char *const argv[], char *const envp[);
2.4.1 demo.cenv是环境变量
#include2.4.2 execvpe#include #include int main(int argc, char const *argv[], char **env) { for (size_t i = 0; i < argc; i++) { printf("argc[%ld] = %sn", i, argv[i]); } for (size_t i = 0; i < argc; i++) { printf("env[%ld] = %sn", i, env[i]); } pid_t pid = getpid(); pid_t ppid = getppid(); printf("pid = %dn",pid); printf("ppid = %dn",ppid); char buffer[1024]; int n_r = read(0, buffer, sizeof(1024) - 1); buffer[n_r] = ' '; printf("buffer = %sn", buffer); return 0; }
#include三、vfork、system 3.1 vfok#include #include int main(int argc, char const *argv[]) { printf("hello worldn"); //execl("./demo","./demo","xasxa","hahaha",NULL); char *arg[] = {"./demo", "hello1", "hello2", NULL}; char *env[] = {"UXAS = admin","PASSWD = 123","trytrytry",NULL}; //execv("./demo", arg); //execlp("/home/jsetc/2022.7c++/多进程/demo","./demo","world1","world2",NULL); execvpe("/home/jsetc/2022.7c++/多进程/demo", arg, env); printf("快乐暑假n"); }
先执行子进程
如果没有exec,则会共享父进程资源,子进程一定要加exit(1)进行异常退出,不会造成二次释放
3.2 system 暑期编程PK赛 得CSDN机械键盘等精美礼品!vfork比fork更节省空间
只有遇到exec的时候,才会开辟新空间



