进程控制常用的一些操作

来源:互联网 发布:java项目部署到tomcat 编辑:程序博客网 时间:2024/06/03 14:37

1、获取进程的id

int main0(){    printf ("当前进程 ID %d\n",  getpid());    printf ("当前父进程:%d\n", getppid());    printf ("当前用户:  %d\n",  getuid());    while (1);    return 0;}

2、fork 和 vfork之前的博客里有,这里就不啰嗦了

// forkint main1(){    // fork : 创建一个子进程    // 如果创建失败,返回-1    // 成功返回两个值,如果是在父进程,返回子进程的ID    // 如果是在子进程,返回值是0    pid_t pid = fork();    if (-1 == pid)    {        perror ("fork");        return -1;    }    if (pid > 0)                // 父进程    {        printf ("我是父进程,pid = %d\n", getpid());    }    else                        // 子进程    {        printf ("我是子进程,pid = %d\n", getpid());    }    while (1);    return 0;}// fork1   父进程和子进程是异步的,输出都是1int main2(){    int count = 0;    pid_t pid = fork();    count++;    printf ("count = %d\n", count);    return 0;}// fork2    会产生8个进程int main3(){    fork();    fork();    fork();    printf ("a\n");    while (1);    return 0;}// fork3    产生20个进程int main4(){    fork();                         // 产生2个进程    fork() && fork() || fork();     // 之前的每个进程都会产生5个进程    fork();                         // 翻倍    printf ("a\n");    while (1);    return 0;}// 1、vfork 的子进程必须要显示调用 exit();// 2、vfork 子进程和父进程共享数据段// 3、vfork 的子进程先于父进程执行,子进程执行完,CPU才能调度到父进程int main5(){    int count = 0;    pid_t pid = vfork();    if (pid < 0)    {        perror ("vfork");        return -1;    }    count++;    if (pid > 0)                    // 父进程    {        printf ("我是父进程,pid = %d  count = %d\n", getpid(), count);    }    else                            // 子进程    {        printf ("我是子进程:pid = %d  count = %d\n", getpid(), count);        while (1);        exit  (0);    }    return 0;} 

3、exec函数族

// execl  格式:int execl(const char * path, const char* arg1,...)int main6(){    // 第一个参数需要一个路径,能够找到需要执行的文件    // 后面的参数表明执行的方式,和在终端方式类似,如果程序执行需要    // 其他的参数 ls -l,参数要作为函数的实参传过去    // 最后需要补一个 NULL    int ret = execl ("/bin/ls", "ls", NULL);    if (-1 == ret)    {        perror ("exexl");        return -1;    }       return 0;}int main7(){    // 产生一个新的程序,替换了原有的程序,原有的进程 id 是不变的    // int ret = execl ("bin/ls", "ls", "-l", NULL);    int ret = execl ("/bin/ps", "ps", "-ef", NULL);    if (-1 == ret)    {        perror ("execl");        return -1;    }    printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");    return 0;}// execv    格式:int execv(const char * path, const char *argv[])int main8(){    char* a[] = {"file.c", NULL};    int ret = execv("file", a);    if (-1 == ret)    {        perror ("execl");        return -1;    }    return 0;}// execlp   格式:int execlp(const char * path, const char* arg1,...)int main9(){    int ret = execlp ("./file", "file", NULL);    if (-1 == ret)    {        perror ("execl");        return -1;    }    return 0;}int main10(){    int ret = execlp ("ls", "ls", "-l", NULL);    if (-1 == ret)    {        perror ("execl");        return -1;    }    printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");    return 0;}// systemint main11(){    printf ("请选择文件:\n");    system ("ls /home");    char str[100];    while (1)    {        fgets (str, 100, stdin);        printf ("[root@promote 15]# ");        system (str);    }    return 0;}int main12(){    printf ("hello world\n");    sleep (1);    // 在内部fork()一个子进程,调用 /bin/sh -c string来执行    system ("ps -ef | grep a.out");    printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");    return 0;}

4、进程的终止

// 进程退出void func(){    printf ("33333333333333333333333\n");    exit (0);       // 进程终止}int main13(){    printf ("hello\n");    printf ("1111111111111111");    // 在停止进程前,要检查文件的打开情况,并把文件缓冲区中    // 的内容写回文件才停止进程    exit (0);    return 0;}int main14(){    printf ("hello\n");    printf ("11111111111111111");    // _exit:直接使进程停止,清除其使用的内存,并清除缓冲区中内容    _exit (0);    return 0;}
原创粉丝点击