• 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;


    ----------------------------------------------在穷无非讨饭,不死终会出头。
  • 相关阅读:
    实用画刷填充图形
    PDA连接远程数据库的三种解决方案
    图形编程入门之如何创建用于绘制的 Graphics 对象
    使用渐变画笔填充形状
    使用钢笔绘制线条和形状
    How to: Display a Gradient Fill
    实现防火墙的“电话已关机”,“此号码已停机”,“号码不存在”等提示音的方法
    MSDN课程
    android振动器
    android视频播放
  • 原文地址:https://www.cnblogs.com/scrat/p/2558802.html
Copyright © 2020-2023  润新知