Linux进程操作

来源:互联网 发布:混沌与秩序2随从数据库 编辑:程序博客网 时间:2024/05/01 23:22

System系统调用

#include <stdlib.h>

int system(const char *command);

system函数传递给/bin/sh –c 来执行command的命令(启动shell执行command)如果没找到返回127,其他错误返回-1,正确返回0,如果commandNULL,那么返回一个非零值

int main(int arg,char* args[])

{

system("ls -l");

return 0;

}

Fork系统调用

#include <sys/types.h>

#include <unistd.h>

pid_t fork(void); //返回一个PID

在语句fpid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if(fpid<0)……
    为什么两个进程的fpid不同呢,这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
    1)在父进程中,fork返回新创建子进程的进程ID;
    2)在子进程中,fork返回0;
    3)如果出现错误,fork返回一个负值;

    在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

#include <unistd.h>  

#include <stdio.h>   

int main ()   

{   

    pid_t fpid; //fpid表示fork函数返回的值  

int count=0;  

printf("begin\n");

    fpid=fork();   

    if (fpid < 0)   

        printf("error in fork!");   

    else if (fpid == 0) {  

        printf("i am the child process, my process id is %d/n",getpid());   

        printf("我是爹的儿子/n");//对某些人来说中文看着更直白。  

        count++;  

    }  

    else {  

        printf("i am the parent process, my process id is %d/n",getpid());   

        printf("我是孩子他爹/n");  

        count++;  

    }  

printf("统计结果是: %d/n",count); 

   printf("end\n"); 

    return 0;  

}

Begin输出一次,end输出两次,两次count都为1

fork()会产生两个完全相同的内存空间,然后将父进程代码拷贝,但是子进程只会从fork后开始执行 

例:

int main()

{

pid_t fpid; //fpid表示fork函数返回的值

int i = 0;

for(;i<4;i++)

{

fpid=fork();

}

while (1)

{

sleep(1);

printf("%d\n",getpid());

}

 

return 0;

}

会产生16个进程

启动一个新的程序,替换原有程序,因此被执行进程的PID不变

#include <unistd.h>

int execve(const char *filename, char *const argv[],char *const envp[]);

filename:要执行程序的完整路径

argv[]:参数列表,包括argv[0],指的是执行程序名

envp[]:执行execed程序的指针,可为NULL

 

例:

int main()

{

char *arg[] = { "/bin/ls", "-l", NULL };

execve("/bin/ls", arg, NULL);//成功不返回

return 0;//不执行

}

execvesystem的区别

system是在本进程中调用另一个程序

execve是用另一个程序替代本程序

收集子进程退出状态

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *status);

//fork出多个子进程时,要确定wait哪个进程

pid_t waitpid(pid_t pid, int *status, int options); // options一般为0

int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);

 

例:

int main ()

{

    pid_t fpid;

    int stat;

    fpid=fork();

    if (fpid < 0)

        printf("error in fork!");

    else if (fpid == 0) {

        printf("child start\n");

        sleep(2);

        printf("child end\n");

return 100;

    }

    else {

        printf("parent start\n");

        wait(&stat);

// waitpid(17256, statu,0);

        //等到子进程退出才能执行,返回子进程返回值,因此一定先出现child end才会出现parent end

printf("%d\n",WEXITSTATUS(stat));//stat直接无法识别必须用宏定义  

printf("parent end\n");

    }

    return 0;

}

僵死进程:子进程早已退出,而父进程在wait等待回收状态,子进程虽然死掉了,资源释放了,但在内核进程表中保留了一条等待父进程回收。

0 0
原创粉丝点击