找回密码
 立即注册
首页 业界区 安全 linux系统编程02-进程基本知识

linux系统编程02-进程基本知识

育局糊 2025-10-1 17:42:39
目录

  • 1. pid
  • 2. 进程的产生:fork
  • 3. 进程的消亡及释放资源:wait
  • 4. exec函数族
  • 综合例子:mybash
  • 5. 用户权限和组权限:setuid
  • 6. 观摩课
  • 7. system
  • 8. 进程会计
  • 9. 进程时间
  • 10.守护进程
  • 11. 系统日志

1.png

2.png

1. pid


  • pid_t : 进程号,一般是int_64,不同机器不同,有限资源
  • ps axf :查看进程信息 ps -axm :详细信息 ps -ax -L : linux特有形式显示
  • 进程号是顺次向下使用,区别于 fd(占位最小)
  • getpid\getppid :获取进程号\父进程号
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. pid_t getpid(void);
  4. pid_t getppid(void);
复制代码
2. 进程的产生:fork
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. pid_t fork(void);
复制代码

  • 返回值:

    • 出错: -1
    • 成功:返回两次。 父进程:子进程pid;子进程:0

  • 注意点:fork之前刷新所有该刷新的流, fflush(NULL)

    • 父进程与子进程完全一致(duplicate) ,运行位置也一致
    • fork后父子进程的区别:fork返回值不同,pid不同,ppid不同,未决信号量和文件锁不继承,资源利用量清0
    • 调度器的策略决定哪个进程先运行

例子:fork之前刷新所有该刷新的流
示例代码:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<sys/types.h>
  4. #include<unistd.h>
  5. int main()
  6. {
  7.     pid_t pid;
  8.     printf("[%d]:Begin.\n",getpid());
  9.    
  10.     //fork前刷新所有流!!
  11.     fflush(NULL);
  12.     pid = fork();
  13.     if(pid < 0)
  14.     {
  15.         perror("fork()");
  16.         exit(1);
  17.     }
  18.     if(pid == 0)
  19.     {
  20.         printf("[%d]:Child is working!\n", getpid());
  21.     }
  22.     else
  23.     {
  24.         printf("[%d]:Parent is working!\n", getpid());
  25.     }
  26.     printf("[%d]:End.\n", getpid());
  27.                
  28.                 //没有收尸,详见3.进程资源释放
  29.     exit(0);
  30. }
复制代码
运行结果:
3.png

未加fflush
4.png

加了fflush
说明:
文件是全缓冲,如果没有fork之前刷新流,子进程会继承父进程的缓冲区,所以缓冲区里有 “Begin.”,导致打印了两次。
加getchar()  ps axf查看进程信息
5.png

例子:多进程筛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

相关推荐

您需要登录后才可以回帖 登录 | 立即注册