zoukankan      html  css  js  c++  java
  • Linux下创建子进程fork函数等的基本使用

    1. fork函数,创建一个子进程

    pid_t fork(void); //pid_t就是一个整形类型

    返回值: 

    成功的情况下,父进程返回子进程的id(非负整数),子进程返回0;

    失败的情况,父进程返回-1,创建子进程失败,也就是没有创建子进程。

    举例说明:

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

    pid_t pid;

    pid = fork(); //创建一个子进程,从这段代码开始(包括这段代码)往后,就有两个进程在执行了,

    //但是,哪个进程先执行不确定,看哪个进程抢占到cpu了。

    if (pid == -1 ) {//-1说明是父进程,-1表示创建进程失败

    perror("fork fail"); exit(1);

    } else if (pid > 0) {//pid大于0说明是父进程,>0 表示创建子进程成功

    sleep(1);//这里父进程睡眠1秒是为了让子进程先退出,否则子进程变为孤儿进程(即子进程的父进程变为init进程)

    printf("parent_pid = %d, parentID = %d ", getpid(), getppid());

    } else if (pid == 0) {//pid等于0说明是子进程,此时表示执行fork函数成功,不是创建子进程。

    printf("child_pid = %d, parentID=%d ", getpid(), getppid());

    }

    printf("父子进程都会执行到这句话 ");

    return 0;

    2. fork循环创建n个子进程

     循环创建子进程的关键:子进程里使用break跳出循环,只让父进程创建子进程,不让子进程里再创建子进程,否则最后就是创建是2^n-1个子进程了,而且这样逻辑有点乱的感觉,不好控制。

    举例说明:

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

    int i, n = 3; //默认创建3个子进程

    if (argc == 2) { n = atoi(argv[1]); } //可以通过命令行参数传进来要创建的个数

    for (i = 0; i < n; i++){ //父进程循环n遍,执行下面的if里面的条件fork去创建子进程,i等于n时退出循环,总共创建n个子进程。

    if (fork() == 0) break; //fork等于0说明是子进程,直接跳出循环

    //下面是各个子进程和父进程都会执行到的代码 

    sleep(i); //让第i个进程睡眠i秒,这样可以看到各个进程按照顺序退出,便于查看结果

    if (n == i) printf("I am parent, pid = %d ", getpid()); 

    else printf("I'm %dth child, pid = %d ", i+1, getpid());

    return 0;

    3. getpid函数

    pid_t getpid(void); //获得当前进程的id

    4. getppid函数

    pid_t getppid(void); //获得当前父进程的id

    5. getuid函数

    uid_t getuid(void); //获得当前进程的真实的用户id

    6. getgid函数

    uid_t geteuid(void); //获得当前进程的有效的用户id

    7. kill函数

    int kill(pid_t pid, int sig); //向进程pid发送sig信号

    如果pid为0,sig被发送给当前组的所有进程 

    如果pid为-1,sig被发送给当前进程有权限发送的所有进程,处init进程外

    如果pid小于-1,sig被发送给进程组为pid的所有进程,如-6610表示发送给进程组为6610的所有进程

    如果sig为0,没有发送信号,此时该函数用于检查进程pid或者进程组pid是否存在 

    返回值:成功返回0;失败返回-1 。 

    8. exit函数 

    void exit(int status); //退出当前进程

    C标准库提供两个常量:EXIT_SUCCESS(成功退出)  和  EXIT_FAILURE(失败)

    附:判断一个函数是系统函数还是库函数的依据:

    1) 是否访问了内核的数据结构

    2) 是否访问了外部的硬件资源

    如果存在两者的任一情况,则是系统函数,否则是库函数;系统函数在man手册的第二章,库函数在man手册的第三章。 

  • 相关阅读:
    c# 基础连接已经关闭: 连接被意外关闭,错误的解决
    关于SSIS中代码页(Code Page) 相关错误
    WinAPI: CopyFileEx
    RegularExpressions(5) RegularExpressions 成员(二) IRegex
    RegularExpressions(4) RegularExpressions 成员(一)
    RegularExpressions(3) RegularExpressions 的工作思路
    一句话复制整个文件夹(当然包括嵌套文件夹) 回复 "张哆哆" 的问题
    有趣的 TBitBtn.Kind
    如何用 GDI+ 高质量地缩放图片 回复 "程序牛" 的问题
    如何用 GDI 绘制阴影文字 回复 "Splendour" 的问题
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/6795102.html
Copyright © 2011-2022 走看看