目录
- 1. pid
- 2. 进程的产生:fork
- 3. 进程的消亡及释放资源:wait
- 4. exec函数族
- 综合例子:mybash
- 5. 用户权限和组权限:setuid
- 6. 观摩课
- 7. system
- 8. 进程会计
- 9. 进程时间
- 10.守护进程
- 11. 系统日志
1. pid
- pid_t : 进程号,一般是int_64,不同机器不同,有限资源
- ps axf :查看进程信息 ps -axm :详细信息 ps -ax -L : linux特有形式显示
- 进程号是顺次向下使用,区别于 fd(占位最小)
- getpid\getppid :获取进程号\父进程号
- #include <sys/types.h>
- #include <unistd.h>
- pid_t getpid(void);
- pid_t getppid(void);
复制代码 2. 进程的产生:fork
- #include <sys/types.h>
- #include <unistd.h>
- pid_t fork(void);
复制代码
- 返回值:
- 出错: -1
- 成功:返回两次。 父进程:子进程pid;子进程:0
- 注意点:fork之前刷新所有该刷新的流, fflush(NULL)
- 父进程与子进程完全一致(duplicate) ,运行位置也一致
- fork后父子进程的区别:fork返回值不同,pid不同,ppid不同,未决信号量和文件锁不继承,资源利用量清0
- 调度器的策略决定哪个进程先运行
例子:fork之前刷新所有该刷新的流
示例代码:- #include<stdio.h>
- #include<stdlib.h>
- #include<sys/types.h>
- #include<unistd.h>
- int main()
- {
- pid_t pid;
- printf("[%d]:Begin.\n",getpid());
-
- //fork前刷新所有流!!
- fflush(NULL);
- pid = fork();
- if(pid < 0)
- {
- perror("fork()");
- exit(1);
- }
- if(pid == 0)
- {
- printf("[%d]:Child is working!\n", getpid());
- }
- else
- {
- printf("[%d]:Parent is working!\n", getpid());
- }
- printf("[%d]:End.\n", getpid());
-
- //没有收尸,详见3.进程资源释放
- exit(0);
- }
复制代码 运行结果:
未加fflush
加了fflush
说明:
文件是全缓冲,如果没有fork之前刷新流,子进程会继承父进程的缓冲区,所以缓冲区里有 “Begin.”,导致打印了两次。
加getchar() ps axf查看进程信息
例子:多进程筛3000,0000 ~ 3000,0200之间的质数
示例代码:
[code]#include#include#include#include##define LEFT 30000000##define RIGHT 30000200int main(){ pid_t pid; int i,j; int mark; for(i = LEFT; i 0) { for(i = LEFT+n; i |