zoukankan      html  css  js  c++  java
  • LINUX C系统编程学习笔记进程编程

    进程编程

    一.获取ID:

         #include <sys/types.h>

    #include <unistd.h>

    pid_t getpid(void);

    获取本进程ID

    pid_t getppid(void);

    获取父进程ID

    例: 

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>

    int main(void)
    {
        printf("PID = %d\n",getpid());
        printf("PPID = %d\n",getppid());
        return 0;

    二.进程创建

    #include <unistd.h>

       pid_t fork(void);

    创建子进程

    fork被调用一次返回两次,他可能有三种不同的返回值:

    1.在父进程中fork返回新创建的子进程的PID。

    2.在子进程中,fork返回0.

    3. 如果出现错误,fork返回一个负值

    例: 

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>

    int main(void)
    {
        pid_t pid;
        pid = fork();
        if (pid < 0)
        {
            printf("error in fork!\n");
        }
        else if (pid == 0)
        {
            printf("I am the child process,ID is %s\n",getpid());
        }    
        else 
        {
            printf("I am the parent process,ID is %d\n",getpid());
        }
        return 0;

    考虑以下代码的运行结果:

    #include <unistd.h>
    #include <stdio.h>

    int main(void)
    {
        pid_t pid;
        int count = 0;
        pid = fork();
        count++;
        printf("count = %d\n",count);
        return 0;


    它会打印两次count,但是两次值都是1.现在能看出使用fork的情况了吧。

      pid_t vfork(void);

    创建子进程 

    区别:

    1·vfork:子进程与父进程共享数据段。

        fork: 子进程拷贝父进程的数据段。

    2·fork: 父,子进程的执行次序不确定。

      vfork: 子进程先运行,父进程在运行

      现在把上面的思考中的fork换成vfork后,在想想会是什么结果。

    三.exec函数族 

    exec用被执行的程序替换调用它的程序 

    区别:

    fork创建一个新的进程,产生一个新的PID。

    exec启动一个新的程序,替换原有的进程,PID不变。(好像这个做坏事的时候可以用,(*^__^*) 嘻嘻……)

    1. #include <unistd.h> 

    int execl (const char *path,const char *arg1,········,argn);

    path:被执行的程序名(包含完整路径)

    arg1-argn:被执行程序所需要的命令,含参数含程序名,以空指针(NULL)结束 。

    例:

    #include <unistd.h>

    int main(void)
    {
        execl("/bin/ls","ls","-al","/etc/passwd",(char*)0);
        return 0;


    2.

    int execlp(const char *path,const char *arg1.······argn);

    path:被执行的程序名(不包含路径,将从Path环境变量中直接找该程序)

    arg1-argn:被执行的程序所需的命令行参数,含程序名,以空指针(NULL)结束

    例:

    #include <unistd.h>

    int main(void)
    {
        execlp("ls","ls","-al","/etc/passwd",(char*)0);
        return 0;


    3.

    int execv(const char *path,char * const argv[]);

    path:被执行的程序名(含完整路径)

    argv[]:被执行程序所需要的命令行参数数组

    例:

    #include <unistd.h>

    int main(void)
    {
        char *argv[]={"ls","-al","/etc/passwd",(char*)0};
        execv("/bin/ls",argv);
        return 0;


    4.

    int system(const char * string);

    调用fork产生一个子进程,由子进程来调用/bin/ls来执行参数,string代表的命令。

    例:

    #include <stdlib.h>

    int main(void)
    {
        system("ls -al /etc/passwd");
        return 0;


     四.进程等待

    #include <sys/types.h>

    #include <sys/wait.h>

    pid_t wait(int *status);

    阻塞该进程,直到某个子进程退出。

    例:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <stdlib.h>
    #include <unistd.h>

    int main(void)
    {
        pid_t pc,pr;
        pc = fork();
        if (pc == 0) //如果是子进程
        {
            printf("This is child process with pid of %d\n",getpid());
            sleep(10); //睡眠10秒
        }
        else if (pc > 0) //如果是父进程
        {
            pr = wait(NULL);//等待
            printf("I catched a child process with pid of %d\n",pr);
        }
        exit(0);
        return 0;


    ----------------------------------------------在穷无非讨饭,不死终会出头。
  • 相关阅读:
    【BZOJ4676】Xor-Mul棋盘 拆位+状压DP
    【BZOJ4688】One-Dimensional 矩阵乘法
    【BZOJ4704】旅行 树链剖分+可持久化线段树
    【BZOJ4709】[Jsoi2011]柠檬 斜率优化+单调栈
    【BZOJ4711】小奇挖矿 树形DP
    【BZOJ4715】囚人的旋律 DP
    【BZOJ4712】洪水 树链剖分优化DP+线段树
    服务器相关 HTTP 请求错误
    RSA算法
    公钥和私钥解释
  • 原文地址:https://www.cnblogs.com/scrat/p/2558802.html
Copyright © 2011-2022 走看看