码迷,mamicode.com
首页 > 系统相关 > 详细

Linux 进程创建

时间:2016-08-26 15:22:07      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://www.cnblogs.com/zhanggaofeng/p/5810309.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!