关闭

linux进程、线程常用的几个基础知识点

标签: linuxc进程线程
572人阅读 评论(0) 收藏 举报
分类:

1.      Fork会复制父进程所有资源,父子进程完全独立。虽然一个进程可以包含多个线程,但是fork后的子进程是单线程的。

2.       vfork不会复制所有的资源,父子进程共享地址空间,在子进程中队虚拟内存空间变量的修改其实也是对父进程中值的修改。同时子进程运行时会阻塞父进程。子进程调用结束时要调用_exit() 退出,不然子进程的输入输出缓存会影响到父进程,exit会刷新输入输出流,清空缓冲区,可能造成临时文件丢失,所以在子进程中一般不用exit。_exit不会进行刷新缓冲区等操作,所以forkvfork创建的子进程一般都用_exit退出

3.      fork后的父子进程代码段,数据段,堆栈段的内容都是相同的,只是用if-eles 判断fork的返回值来走不同的分支

4.      exec() 把进程的代码段、数据段、堆栈段的内容都被替换掉。

所以一般 fork一个子进程,然后在子进程中调用exec,子进程就完全被替换掉了

父进程自己跑自己的

execl;ececlp;execle;execv;execve;execvp 出错返回-1,正确无返回值

P:path,第一个参数执行文件名可以不用带路径,函数自动搜索系统的path路径

l:list  execl(“pw”,参数a,参数b,null);

v:vector execve(“pw”,argv,environ) char*argv[] 的最后一个指向null

e:environment  ;extern char** environ 当前程序的全局环境

Fork.o

#include<stdio.h>

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

{

    printf("welecometo PW\n");

    int i=0;

    for(;i<argc;i++)

    {

       printf("argv[%d]:[%s]\n",i,argv[i]);

    }

    return 0;

}

 

#include<stdio.h>

#include<unistd.h>

#include<sys/types.h>

#include<stdlib.h>

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

{

    pid_t pid;

    int status;

    extern char**environ;

    int i=0;

    for(;i<argc;i++)

    {

       printf("i=%d,argv=[%s]\n",i,argv[i]);

    }

    //execve("PW",argv,environ);

    //printf("运行上一句execve ,这一句不会输出,后面的都不会执行n");

    if((pid=vfork())<0)

    {

       printf("forkerr\n");

       exit(1);

    }

    elseif(pid==0)

    {

       printf("line16:this child process %d,parent is %d\n",getpid(),getppid());

       usleep(1000000);

       execve("PW",argv,environ);

       _exit(1);

    }

    else

    {

       printf("thisparent %d,child is %d\n",getpid(),pid);

       printf("parent has waited child %d\n",wait(&status));

    }

}

————————————————————————————————————

PW

#include<stdio.h>

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

{

    printf("welecometo PW\n");

    int i=0;

    for(;i<argc;i++)

    {

       printf("argv[%d]:[%s]\n",i,argv[i]);

    }

    return 0;

}

 

[root@localhost7-PcroceeControl]# ./fork.o PW

i=0,argv=[./fork.o]

i=1,argv=[PW]

line16:this child process 3507,parent is 3506

thisparent 3506,child is 3507

welecometo PW

argv[0]:[./fork.o]

argv[1]:[PW]

parenthas waited child 3507

 

 

 

5.      进程等待

Sys/types.h

Sys/wait.h

Pid_t wait(int *status);

Pid_t waitpid(pid_t pid,int *status,int options)

Int waited(idtype_t idtype,id_t id, siginfo_t *infop,intoptions);

 

Wait() = waitpid(-1, &status, 0);子进程不存在

Pid<-1 等待进程组id=pid的绝对值的任一子进程

pid=-1 等待任一子进程

pid=0 等待组id等于调用组id 的任一子进程

pid>0 等待进程id等于pid的子进程

6.      进程组

Sys/types.h

unistd.h

pid_t getpgrp(viod);

int setpgid(pid_t pid,pid_t pgid) 成功0,失败-1 :pid等于pgid时用于创建新的进程组,不等时则把pid加入pgid组

 

进程调度

Sched.h

Int sched_setscheduler(pid_t pid,int policy,const structsched_param *param);

Int sched_getscheduler(pid_t  pid);

Setpriority() ;getpriority()

 

int phread_cancel(phread_t pt);取消一个线程

int phread_detach(pthread_t pt);分离一个线程

int phread_equal(pthread_t pt1,pthread_t pt2);是不是同一线程,pt1,pt2不是整数只能用这个函数判断

0
0
查看评论

Java笔记 - 线程基础知识

进程是一个执行中程序的实例,是操作系统进行资源分配和调度的一个独立单元。线程是进程中一个单一的程序控制流,是 CPU 调度和分派的基本单元。进程在执行时拥有独立的内存空间,进程中的线程可以共享进程的内存空间。在 Java 的世界中,进程可以拥有多个并发执行的线程,多线程是实现并发任务的方式。
  • yanshazi
  • yanshazi
  • 2016-04-05 13:01
  • 2341

Node.js知识点详解(一)基础部分

基本概念 Node.js,或者 Node,是一个可以让 JavaScript 运行在服务器端的平台。可以说,Node.js开创了javascript模块化开发的先河,早期的javascript需求都很简单,基本都是写成函数的,然后是面向过程的写法,后来慢慢的引入面向对象开发思想,再后来就慢慢写成 ...
  • asd131531
  • asd131531
  • 2015-01-04 18:44
  • 1192

进程、线程 知识点整理

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 进程线程专题 ++++++++++++++++++++++++++++++++++++++++++++++...
  • S_O_Q
  • S_O_Q
  • 2013-11-01 23:31
  • 976

Linux下查看某个进程创建了多少线程

方法一: 1. 找出进程号: cba001:/proc/21723 # ps -ef|grep named root     30659     1  0 16:45 ?  &...
  • lzqinfen
  • lzqinfen
  • 2014-09-02 16:48
  • 1263

OpenCV基础知识点总结

/********************************************************************************************************************** ...
  • u013360881
  • u013360881
  • 2016-01-05 19:09
  • 784

Node.js的线程和进程

前言   很多Node.js初学者都会有这样的疑惑,Node.js到底是单线程的还是多线程的?通过本章的学习,能够让读者较为清晰的理解Node.js对于单/多线程的关系和支持情况。同时本章还将列举一些让Node.js的web服务器线程阻塞的例子,最后会提供Node.js碰到这类cpu密集型问题...
  • u014511737
  • u014511737
  • 2015-07-21 20:39
  • 2375

查看进程运行在哪个CORE上以及进程下线程数量

$ ps -o pid,psr,comm -p   PID可以通过 #ps -ef | grep 获取到 查看指定进程下的线程数量 ps -Lf pid 查看对应进程下的线程数
  • notbaron
  • notbaron
  • 2016-08-30 00:21
  • 30462

Linux中线程和进程的区别

1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所...
  • qq_21792169
  • qq_21792169
  • 2015-12-30 20:55
  • 15588

Linux线程之线程 线程组 进程

Thread Local Storage,线程本地存储,大神Ulrich Drepper有篇PDF文档是讲TLS的,我曾经努力过三次尝试搞清楚TLS的原理,均没有彻底搞清楚。这一次是第三次,我沉浸glibc的源码和kernel的源码中,做了一些实验,也有所得。对Linux的线程有了进一步的理解。 ...
  • s490602363
  • s490602363
  • 2014-02-26 15:51
  • 731

linux常用的命令以及其他的一些知识点

切换到root 目录下 sudo -s -H (或者su -) shutdown -h now 立刻进行关机 halt shutdown -r now reboot 现在重新启动计算机 切换用户 su - logout 注销用户 linux 中文乱码的处理:LANG="...
  • zhangyaoming2004
  • zhangyaoming2004
  • 2011-09-27 13:37
  • 2369
    个人资料
    • 访问:160779次
    • 积分:3244
    • 等级:
    • 排名:第12448名
    • 原创:154篇
    • 转载:115篇
    • 译文:0篇
    • 评论:3条
    最新评论