Linux 进程创建

Posted 庖丁解牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 进程创建相关的知识,希望对你有一定的参考价值。

一:system系统调用
#include <stdlib.h>
int system(const char *string);
system函数传递给/bin/sh -c 来执行string所指定的命令。
string中可以包含选项和参数
如果没有找到/bin/sh。函数返回127,如果出现其他错误返回-1,成功返回0,但如果string为NULL,返回一个非0值
system调用其他进程是通过shell调用其他进程,本程序进程与被调用的进程之间没有关系。

 

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

int main(int arg, char * args[])
{
    system("ls -l");
    return 0;
}

 

二:fork系统调用
#include<unistd.h>
pid_t fork(void);
fork执行成功,向父进程返回子进程的PID,并向子进程返回0,这意味着fork即使只调用一次,也会返回两次。
fork创建的新进程是和父进程(除了PID和PPID)一样的副本。
父进程和子进程之间有点区别,子进程没有继承父进程的超时设置(使用alarm调用)、父进程创建的文件锁,或者未决信号。
但是子进程会继承父进程的文件描述符,内存空间大小,代码
你不能预计父进程是在他的子进程之前还是之后运行,他的执行是无序的,是异步的。
fork的异步行为意味着你不应该在子进程中执行依赖与父进程的代码,反之亦然。
fork调用可能失败,原因是系统上已经运行了太多进程,已经超过了允许他执行的最大进程数。
fork执行失败,会向父进程返回-1,而且不创建子进程。
fork执行成功,向父进程返回子进程的PID,向子进程返回0。

 

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

int main(int arg, char * args[])
{
    pid_t child=fork();
    if(child==-1)
    {
        printf("操作系统出错!\n");
        return -1;
    }
    if(child==0)
    {
        //此时在子进程中
        printf("child is begining!\n");
        sleep(200);
        printf("child is end!\n");
    }else
    {
        //此时在父进程中,child大于零,child的值就是子进程的PID
        printf("parent is begining!\n");
        sleep(200);
        printf("parent is end!\n");
    }
    /*
     通过观察"/proc"下的父子进程,发现父子进程共用一段代码
     */
    return 0;
}

 

以上是关于Linux 进程创建的主要内容,如果未能解决你的问题,请参考以下文章

linux c 退出进程的代码

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程

代码片段:Shell脚本实现重复执行和多进程

Linux 编程之进程篇:task_struct进程创建和退出

Linux 编程之进程篇:task_struct进程创建和退出