exec族函数
fork()函数生成的子进程只能运行与父进程相同的代码函数,如果想要子进程执行另外一个程序,需要用到exec族的函数,如下:
execlp()函数
int execlp(const char *file,const char *arg,…);
/*** execlp.c ***/ #include<stdio.h> #include<stdlib.h> #include<unistd.h> int main() { pid_t pid; pid = fork(); if(-1 == pid) { perror("fork error:"); exit(1); } else if(0 < pid) { sleep(2); printf("parent\n"); } else { execlp("ls","ls","-l","-a",NULL); } return 0; }
运行结果:
ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ./execlp
总用量 28
drwxrwxr-x 2 ubuntu1604 ubuntu1604 4096 8月 6 13:19 .
drwxrwxr-x 3 ubuntu1604 ubuntu1604 4096 8月 6 13:06 ..
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8856 8月 6 13:19 execlp
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 274 8月 6 13:19 execlp.c
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 37 8月 6 13:10 test.c
parent
execl()函数
execl()函数第一个参数跟的是程序路径地址
int execl(const char *path,const char*arg,…);
/*** execl.c ***/ #include<stdio.h> #include<stdlib.h> #include<unistd.h> int main() { pid_t pid; pid = fork(); if(-1 == pid) { perror("fork error:"); exit(1); } else if(0 < pid) { sleep(2); printf("parent\n"); } else { execlp("/bin/ls","ls","-l","-a",NULL); } return 0; }
运行结果:
ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ gcc execl.c -o execl
ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ./execl
总用量 44
drwxrwxr-x 2 ubuntu1604 ubuntu1604 4096 8月 6 13:23 .
drwxrwxr-x 3 ubuntu1604 ubuntu1604 4096 8月 6 13:06 ..
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8856 8月 6 13:23 execl
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 280 8月 6 13:23 execl.c
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8856 8月 6 13:19 execlp
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 275 8月 6 13:21 execlp.c
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 37 8月 6 13:10 test.c
parent
该函数可以执行自定义函数:
/*** * test.c **/ #include<stdio.h> #include<unistd.h> int main() { printf("This is a test\n"); sleep(1); return 0; } /*** execl.c ***/ #include<stdio.h> #include<stdlib.h> #include<unistd.h> int main() { pid_t pid; pid = fork(); if(-1 == pid) { perror("fork error:"); exit(1); } else if(0 < pid) { sleep(2); printf("parent\n"); } else { execlp("./test","test",NULL); } return 0; }
运行结果:
ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ./execl
This is a test
parent
execv()函数
int execv(const char * file,char *const argv[]);
/*** execv.c ***/ #include<stdio.h> #include<stdlib.h> #include<unistd.h> int main() { pid_t pid; pid = fork(); if(-1 == pid) { perror("fork error:"); exit(1); } else if(0 < pid) { sleep(2); printf("parent\n"); } else { char *argv[] = {"ls","-l","-a","-h",NULL}; execv("/bin/ls",argv); } return 0; }
运行结果:
ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ gcc execv.c -o execv
ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ./execv
总用量 76K
drwxrwxr-x 2 ubuntu1604 ubuntu1604 4.0K 8月 6 13:43 .
drwxrwxr-x 3 ubuntu1604 ubuntu1604 4.0K 8月 6 13:06 ..
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.7K 8月 6 13:34 execl
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 271 8月 6 13:34 execl.c
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.7K 8月 6 13:19 execlp
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 275 8月 6 13:21 execlp.c
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.8K 8月 6 13:43 execv
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 343 8月 6 13:42 execv.c
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.5K 8月 6 13:32 test
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 106 8月 6 13:34 test.c
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 55 8月 6 13:28 while.c
parent
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2018-08-06 1014 Waiting in Line (30)
2018-08-06 1057 Stack (30)