您的位置:首页 > 博客中心 > 编程语言 >

linux多线程总结

时间:2022-03-28 04:56

1 进程环境

 

C程序总是从main函数开始执行。main函数的原型是:

    int main(int argc, char* argv[]); 

      当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。启动例程从内核取得命令行参数和环境变量值,然后调用main函数。

1.1 进程终止

 

有8种方式能种子进程,其中5种是正常终止,3种是异常终止。

正常:

        注意:内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显示或隐式地(通过调用exit)滴啊用_exit或_Exit;进程也可非自愿地有 一个信号使其终止。

    1.2 进程内存布局

     

    每个进程所分配的内存由很多部分组成,通常称之为"段"。如下所示:

      Figure 1 典型的存储空间安排

      2 进程控制

       

          每个进程都有进程ID,其中ID为0的进程是调度进程(交换进程);进程为1的是init进程,并且init进程决不会终止,

      2.1 进程的创建

       

          进程的创建可以通过函数fork和vfork进行。

      重点注意:

      不同的进程拥有不同的地址空间。如在不同的两个进程都拥有100的地址,那么这两个100存放的值是不一样的。

       

      当管道的一端被关闭后,下列两条规则起作用:

      1. 当读(read)一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示文件结束。
      2. 如果写(write)一个读端已被关闭的管道,则产生信号SIGPIPE。如果忽略该信号或者捕获该信号并从其处理程序返回,则write返回-1,errno设置为EPIPE。

       

      如下程序:

       

       1 main(){ 
       2     int n,fd[2];    pid_t pid;     char line[100]; 
       3     pipe(fd); 
       4     if((pid=fork()<0) 
       5         return; 
       6     else if(pid>0){ 
       7         close(fd[0]); 
       8         write(fd[1],"hello world\n",12); //向管道中写入数据
       9     } 
      10     else{ 
      11         close(fd[1]); 
      12         n = read(fd[0],line,12);     //从管道中读取数据 
      13         write(STDOUT_FILENO, lien, n);//输出终端 
      14     } 
      15 } 

      4.1.2 FIFO

       

          FIFO也称为命名管道。与管道不同,通过FIFO不相关的进程也能交换数据。FIFO的使用方式是:先创建(mkfifo),然后使用open打开,接着就能使用I/O系统调用(如read()、write()和close())操作打开的文件描述符了。

       

      int mkfifo(const char* path, mode_t mode); 
                                                   返回值:若成功,返回0;若出错,返回-1;

        进程地址空间

        进程标识符和凭证

        文件、文件IO和目录

        文件系统

        信号

        定时器

        POSIX线程

        优先级与调度

        资源与CPU时间

        进程间通信

        杂项

        Linux特有

        文件系统ID

        见注释

        ü

        setfsuid()、setfsgid()。一旦相应的有效ID发生变化,那么这些ID也会随之改变

        timeerfd定时器

        ü

        见注释

        timerfd_create(),子进程继承的文件描述符与父进程指向相同的定时器

        能力

        见注释

        ü

        capset()。

        功能外延集合

        ü

        ü

         

        能力安全位(securebits)标志

        见注释

        ü

        执行exec()期间,会保全所有的安全位标志,SECBIT_KEEP_CAPS除外,总是会清除该标志

        CPU黏性(affinity)

        ü

        ü

        sched_setaffinity()

        SCHED_RESET_ON_FORK

        ü

        ü

         

        允许的CPU

        ü

        ü

         

        允许的内存节点

        ü

        ü

         

        内存策略

        ü

        ü

         

        文件租约

        ü

        ü

        Fcntl(F_SETLEASE)。子进程从父进程处继承对相同租约的引用

        目录变更通知

        ü

        û

        dnotify API,通过fcntl(F_NOTIFY)来实现支持

        prctl(PR_SET_DUMPABLE)

        见注释

        ü

        exec()执行期间会设置PR_SET_DUMPABLE标志,自行设置用户或组ID程序的情况除外,此时将清除该标志

        prctl(PR_SET_PDEATHIG)

        ü

        û

         

        prctl(PR_SET_NAME)

        û

        ü

         

        oom_adj

        ü

        ü

         

        coredump_filter

        ü

        ü

         

本类排行

今日推荐

热门手游