首页 > 代码库 > Linux 进程创建

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 进程创建