进程控制常用的一些操作

1、获取进程的id

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

    while (1);

    return 0;
}

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

// fork
int 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   父进程和子进程是异步的,输出都是1
int 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;
}

// system
int 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值