精华内容
下载资源
问答
  • 有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及...

    有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。

    一、system()函数调用

    system函数的原型为:

    #include

    int system (const char *string);

    它的作用是,运行以字符串参数的形式传递给它的命令并等待该命令的完成。命令的执行情况就如同在shell中执行命令:sh -c string。如果无法启动shell来运行这个命令,system()函数返回错误代码127;如果是其他错误,则返回-1。否则,system()函数将返回该命令的退出码。

    注意:system()函数调用用一个shell来启动想要执行的程序,所以可以把这个程序放到后台中执行,这里system()函数调用会立即返回。

    可以先运行下面的例子,源文件为new_ps_system.c,代码如下:

    #include

    #include

    int main()

    {

    printf("Running ps with system");

    // ps进程结束后才返回,才能继续执行下面的代码

    system("ps au");// 1

    printf("ps Done");

    exit(0);

    }

    该程序调用ps程序打印所有与本用户有关的进程,最后才打印ps Done。运行结果如下:

    f5015b01640dae8a5b93fda49303a94e.png

    如果把注释1的语句改为:system("ps au &");则system函数立即返回,不用等待ps进程结束即可执行下面的代码。所以你看到的输出,ps Done可能并不是出现在最后一行,而是在中间。

    一般来说,使用system()函数不是启动其他进程的理想手段,因为它必须用一个shell来启动需要的程序,即在启动程序之前需要先启动一个shell,而且对shell的环境的依赖也很大,因此使用system()函数的效率不高。

    二、替换进程映像——使用exec系列函数

    exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同。但是exec系列函数都有一个共同的工作方式,就是把当前进程替换为一个新进程,也就是说你可以使用exec函数将程序的执行从一个程序切换到另一个程序,在新的程序启动后,原来的程序就不再执行了,新进程由path或file参数指定。exec函数比system函数更有效。

    exec系列函数的类型为:

    #include

    char **environ;

    int execl (const char *path, const char *arg0, ..., (char*)0);

    int execlp(const char *file, const char *arg0, ..., (char*)0);

    int execle(const char *path, const char *arg0, ..., (char*)0, char *const envp[]);

    int execv (const char *path, char *const argv[]);

    int execvp(cosnt char *file, char *const argv[]);

    int execve(const char *path, char *const argv[], char *const envp[]);

    这类函数可以分为两大类,execl、execlp和execle的参数是可变的,以一个空指针结束,而execv、execvp和execve的第二个参数是一个字符串数组,在调用新进程时,argv作为新进程的main函数的参数。而envp可作为新进程的环境变量,传递给新的进程,从而变量它可用的环境变量。

    承接上一个例子,如果想用exec系统函数来启动ps进程,则这6个不同的函数的调用语句为:

    注:arg0为程序的名字,所以在这个例子中全为ps。

    char *const ps_envp[] = {"PATH=/bin:usr/bin

    展开全文
  • 有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及...

    有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。

    一、system()函数调用

    system函数的原型为:

    #include

    int system (const char *string);

    它的作用是,运行以字符串参数的形式传递给它的命令并等待该命令的完成。命令的执行情况就如同在shell中执行命令:sh -c string。如果无法启动shell来运行这个命令,system()函数返回错误代码127;如果是其他错误,则返回-1。否则,system()函数将返回该命令的退出码。

    注意:system()函数调用用一个shell来启动想要执行的程序,所以可以把这个程序放到后台中执行,这里system()函数调用会立即返回。

    可以先运行下面的例子,源文件为new_ps_system.c,代码如下:

    #include

    #include

    int main()

    {

    printf("Running ps with system");

    // ps进程结束后才返回,才能继续执行下面的代码

    system("ps au");// 1

    printf("ps Done");

    exit(0);

    }

    该程序调用ps程序打印所有与本用户有关的进程,最后才打印ps Done。运行结果如下:

    aaa3deda4bb2863f10762ca5d1a1109b.png

    如果把注释1的语句改为:system("ps au &");则system函数立即返回,不用等待ps进程结束即可执行下面的代码。所以你看到的输出,ps Done可能并不是出现在最后一行,而是在中间。

    一般来说,使用system()函数不是启动其他进程的理想手段,因为它必须用一个shell来启动需要的程序,即在启动程序之前需要先启动一个shell,而且对shell的环境的依赖也很大,因此使用system()函数的效率不高。

    二、替换进程映像——使用exec系列函数

    exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同。但是exec系列函数都有一个共同的工作方式,就是把当前进程替换为一个新进程,也就是说你可以使用exec函数将程序的执行从一个程序切换到另一个程序,在新的程序启动后,原来的程序就不再执行了,新进程由path或file参数指定。exec函数比system函数更有效。

    exec系列函数的类型为:

    #include

    char **environ;

    int execl (const char *path, const char *arg0, ..., (char*)0);

    int execlp(const char *file, const char *arg0, ..., (char*)0);

    int execle(const char *path, const char *arg0, ..., (char*)0, char *const envp[]);

    int execv (const char *path, char *const argv[]);

    int execvp(cosnt char *file, char *const argv[]);

    int execve(const char *path, char *const argv[], char *const envp[]);

    这类函数可以分为两大类,execl、execlp和execle的参数是可变的,以一个空指针结束,而execv、execvp和execve的第二个参数是一个字符串数组,在调用新进程时,argv作为新进程的main函数的参数。而envp可作为新进程的环境变量,传递给新的进程,从而变量它可用的环境变量。

    承接上一个例子,如果想用exec系统函数来启动ps进程,则这6个不同的函数的调用语句为:

    注:arg0为程序的名字,所以在这个例子中全为ps。

    char *const ps_envp[] = {"PATH=/bin:usr/bin

    展开全文
  • 有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及...

    有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。

    一、system()函数调用

    system函数的原型为:

    #include

    int system (const char *string);

    它的作用是,运行以字符串参数的形式传递给它的命令并等待该命令的完成。命令的执行情况就如同在shell中执行命令:sh -c string。如果无法启动shell来运行这个命令,system()函数返回错误代码127;如果是其他错误,则返回-1。否则,system()函数将返回该命令的退出码。

    注意:system()函数调用用一个shell来启动想要执行的程序,所以可以把这个程序放到后台中执行,这里system()函数调用会立即返回。

    可以先运行下面的例子,源文件为new_ps_system.c,代码如下:

    #include

    #include

    int main()

    {

    printf("Running ps with system\n");

    // ps进程结束后才返回,才能继续执行下面的代码

    system("ps au");// 1

    printf("ps Done\n");

    exit(0);

    }

    该程序调用ps程序打印所有与本用户有关的进程,最后才打印ps Done。运行结果如下:

    如果把注释1的语句改为:system("ps au &");则system函数立即返回,不用等待ps进程结束即可执行下面的代码。所以你看到的输出,ps Done可能并不是出现在最后一行,而是在中间。

    一般来说,使用system()函数不是启动其他进程的理想手段,因为它必须用一个shell来启动需要的程序,即在启动程序之前需要先启动一个shell,而且对shell的环境的依赖也很大,因此使用system()函数的效率不高。

    二、替换进程映像——使用exec系列函数

    exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同。但是exec系列函数都有一个共同的工作方式,就是把当前进程替换为一个新进程,也就是说你可以使用exec函数将程序的执行从一个程序切换到另一个程序,在新的程序启动后,原来的程序就不再执行了,新进程由path或file参数指定。exec函数比system函数更有效。

    exec系列函数的类型为:

    #include

    char **environ;

    int execl (const char *path, const char *arg0, ..., (char*)0);

    int execlp(const char *file, const char *arg0, ..., (char*)0);

    int execle(const char *path, const char *arg0, ..., (char*)0, char *const envp[]);

    int execv (const char *path, char *const argv[]);

    int execvp(cosnt char *file, char *const argv[]);

    int execve(const char *path, char *const argv[], char *const envp[]);

    这类函数可以分为两大类,execl、execlp和execle的参数是可变的,以一个空指针结束,而execv、execvp和execve的第二个参数是一个字符串数组,在调用新进程时,argv作为新进程的main函数的参数。而envp可作为新进程的环境变量,传递给新的进程,从而变量它可用的环境变量。

    承接上一个例子,如果想用exec系统函数来启动ps进程,则这6个不同的函数的调用语句为:

    注:arg0为程序的名字,所以在这个例子中全为ps。

    char *const ps_envp[] = {"PATH=/bin:usr/bin", "TERM=console", 0};

    char *const ps_argv[] = {"ps", "au", 0};

    execl("/bin/ps", "ps", "au", 0);

    execlp("ps", "ps", "au", 0);

    execle("/bin/ps", "ps", "au", 0, ps_envp);

    execv("/bin/ps", ps_argv);

    execvp("ps", ps_argv);

    execve("/bin/ps", ps_argv, ps_envp);

    下面我给出一个完整的例子,源文件名为new_ps_exec.c,代码如下:

    #include

    #include

    #include

    int main()

    {

    printf("Running ps with execlp\n");

    execlp("ps", "ps", "au", (char*)0);

    printf("ps Done");

    exit(0);

    }

    运行结果如下:

    细心的话,可以发现,最后的ps Done并没有输出,这是偶然吗?并不是,因为我们并没有再一次返回到程序new_ps_exec.exe上,因为调用execlp函数时,new_ps_exec.exe进程被替换为ps进程,当ps进程结束后,整个程序就结束了,并没有回到原来的new_ps_exec.exe进程上,原本的进程new_ps_exec.exe不会再执行,所以语句printf("ps Done");根本没有机会执行。

    注意,一般情况下,exec函数是不会返回的,除非发生错误返回-1,由exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但任何在原进程中已打开的目录流都将在新进程中被关闭。

    三、复制进程映像——fork()函数

    1、fork()函数的应用

    exec()调用用新的进程替换当前执行的进程,而我们也可以用fork()来复制一个新的进程,新的进程几乎与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境和文件描述符。

    fork()函数的原型为:

    #include

    #include

    pid_t fork();

    注:在父进程中,fork()返回的是新的子进程的PID,子进程中的fork()返回的是0,我们可以通过这一点来判断父进程和子进程,如果fork()调用失败,它返回-1.

    继承上面的例子,下面我给出一个调用ps的例子,源文件名为new_ps_fork.c,代码如下:

    #include

    #include

    #include

    #include

    int main()

    {

    pid_t pid = fork();

    switch(pid)

    {

    case -1:

    perror("fork failed");

    exit(1);

    break;

    case 0:

    // 这是在子进程中,调用execlp切换为ps进程

    printf("\n");

    execlp("ps", "ps", "au", 0);

    break;

    default:

    // 这是在父进程中,输出相关提示信息

    printf("Parent, ps Done\n");

    break;

    }

    exit(0);

    }

    输出结果为:

    我们可以看到,之前在第二点中没有出现的ps Done是打印出来了,但是顺序却有点不对,这是因为,父进程先于子程序执行,所以先输出了Parent, ps Done,那有没有办法让它在子进程输出完之后再输出,当然有,就是用wait()和waitpid()函数。注意,一般情况下,父进程与子进程的生命周期是没有关系的,即便父进程退出了,子进程仍然可以正常运行。

    2、等待一个进程

    wait()函数和waitpid()函数的原型为:

    #include

    #include

    pid_t wait(int *stat_loc);

    pid_t waitpid(pid_t pid, int *stat_loc, int options);

    wait()用于在父进程中调用,让父进程暂停执行等待子进程的结束,返回子进程的PID,如果stat_loc不是空指针,状态信息将被写入stat_loc指向的位置。

    waitpid()等待进程id为pid的子进程的结束(pid为-1,将返回任一子进程的信息),stat_loc参数的作用与wait函数相同,options用于改变waitpid的行为,其中有一个很重要的选项WNOHANG,它的作用是防止waippid调用者的执行挂起。如果子进程没有结束或意外终止,它返回0,否则返回子进程的pid。

    改变后的程序保存为源文件new_ps_fork2.c,代码如下:

    输出为:

    可以看到这次的输出终于正常了,Parent的输出也在子进程的输出之后。

    总结——三种启动新进程方法的比较

    首先是最简单的system()函数,它需要启动新的shell并在新的shell是执行子进程,所以对环境的依赖较大,而且效率也不高。同时system()函数要等待子进程的返回才能执行下面的语句。

    exec系统函数是用新的进程来替换原先的进程,效率较高,但是它不会返回到原先的进程,也就是说在exec函数后面的所以代码都不会被执行,除非exec调用失败。然而exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但需要注意,任何在原进程中已打开的目录流都将在新进程中被关闭。

    fork()则是用当前的进程来复制出一个新的进程,新进程与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境变量和文件描述符,我们通常根据fork()函数的返回值来确定当前的进程是子进程还是父进程,即它并不像exec那样并不返回,而是返回一个pid_t的值用于判断,我们还可以继续执行fork()后面的代码。感觉用fork()与exec系列函数就能创建很多需的进程。

    参考:

    《Linux 高性能服务器编程》

    展开全文
  • 有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及...

    有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。

    一、system函数调用

    system函数的原型为:

    #include

    int system (const char *string);

    它的作用是,运行以字符串参数的形式传递给它的命令并等待该命令的完成。命令的执行情况就如同在shell中执行命令:sh -c string。如果无法启动shell来运行这个命令,system函数返回错误代码127;如果是其他错误,则返回-1。否则,system函数将返回该命令的退出码。

    注意:system函数调用用一个shell来启动想要执行的程序,所以可以把这个程序放到后台中执行,这里system函数调用会立即返回。

    可以先先下面的例子,源文件为new_ps_system.c,代码如下:

    #include

    #include

    int main()

    {

    printf("Running ps with system\n");

    //ps进程结束后才返回,才能继续执行下面的代码

    system("ps au");// 1

    printf("ps Done\n");

    exit(0);

    }

    该程序调用ps程序打印所有与本用户有关的进程,最后才打印ps Done。运行结果如下:

    如果把注释1的语句改为:system("ps au &");则system函数立即返回,不用等待ps进程结束即可执行下面的代码。所以你看到的输出,ps Done可能并不是出现在最后一行,而是在中间。

    一般来说,使用system函数不是启动其他进程的理想手段,因为它必须用一个shell来启动需要的程序,即在启动程序之前需要先启动一个shell,而且对shell的环境的依赖也很大,因此使用system函数的效率不高。

    二、替换进程映像——使用exec系列函数

    exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同。但是exec系列函数都有一个共同的工作方式,就是把当前进程替换为一个新进程,也就是说你可以使用exec函数将程序的执行从一个程序切换到另一个程序,在新的程序启动后,原来的程序就不再执行了,新进程由path或file参数指定。exec函数比system函数更有效。

    exec系列函数的类型为:

    #include

    char **environ;

    int execl (const char *path, const char *arg0, ..., (char*)0);

    int execlp(const char *file, const char *arg0, ..., (char*)0);

    int execle(const char *path, const char *arg0, ..., (char*)0, char *const envp[]);

    int execv (const char *path, char *const argv[]);

    int execvp(cosnt char *file, char *const argv[]);

    int execve(const char *path, char *const argv[], char *const envp[]);

    这类函数可以分为两大类,execl、execlp和execle的参数是可变的,以一个空指针结束,而execv、execvp和execve的第二个参数是一个字符串数组,在调用新进程时,argv作为新进程的main函数的参数。而envp可作为新进程的环境变量,传递给新的进程,从而变量它可用的环境变量。

    承接上一个例子,如果想用exec系统函数来启动ps进程,则这6个不同的函数的调用语句为:

    注:arg0为程序的名字,所以在这个例子中全为ps。

    char *const ps_envp[] = {"PATH=/bin:usr/bin", "TERM=console", 0};

    char *const ps_argv[] = {"ps", "au", 0};

    execl("/bin/ps", "ps", "au", 0);

    execlp("ps", "ps", "au", 0);

    execle("/bin/ps", "ps", "au", 0, ps_envp);

    execv("/bin/ps", ps_argv);

    execvp("ps", ps_argv);

    execve("/bin/ps", ps_argv, ps_envp);

    下面我给出一个完整的例子,源文件名为new_ps_exec.c,代码如下:

    #include

    #include

    #include

    int main()

    {

    printf("Running ps with execlp\n");

    execlp("ps", "ps", "au", (char*)0);

    printf("ps Done");

    exit(0);

    }

    运行结果如下:

    细心的话,可以发现,最后的ps Done并没有输出,这是偶然吗?并不是,因为我们并没有再一次返回到程序new_ps_exec.exe上,因为调用execlp函数时,new_ps_exec.exe进程被替换为ps进程,当ps进程结束后,整个程序就结束了,并没有回到原来的new_ps_exec.exe进程上,原本的进程new_ps_exec.exe不会再执行,所以语句printf("ps Done");根本没有机会执行。

    注意,一般情况下,exec函数是不会返回的,除非发生错误返回-1,由exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但任何在原进程中已打开的目录流都将在新进程中被关闭。

    三、复制进程映像——fork函数

    1、fork函数的应用

    exec调用用新的进程替换当前执行的进程,而我们也可以用fork来复制一个新的进程,新的进程几乎与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境和文件描述符。

    fork函数的原型为:

    #include

    #include

    pid_t fork();

    注:在父进程中,fork返回的是新的子进程的PID,子进程中的fork返回的是0,我们可以通过这一点来判断父进程和子进程,如果fork调用失败,它返回-1.

    继承上面的例子,下面我给出一个调用ps的例子,源文件名为new_ps_fork.c,代码如下:

    #include

    #include

    #include

    #include

    int main()

    {

    pid_t pid = fork();

    switch(pid)

    {

    case -1:

    perror("fork failed");

    exit(1);

    break;

    case 0:

    //这是在子进程中,调用execlp切换为ps进程

    printf("\n");

    execlp("ps", "ps", "au", 0);

    break;

    default:

    //这是在父进程中,输出相关提示信息

    printf("Parent, ps Done\n");

    break;

    }

    exit(0);

    }

    输出结果为:

    我们可以看到,之前在第二点中没有出现的ps Done是打印出来了,但是顺序却有点不对,这是因为,父进程先于子程序执行,所以先输出了Parent, ps Done,那有没有办法让它在子进程输出完之后再输出,当然有,就是用wait和waitpid函数。注意,一般情况下,父进程与子进程的生命周期是没有关系的,即便父进程退出了,子进程仍然可以正常运行。

    2、等待一个进程

    wait函数和waitpid函数的原型为:

    #include

    #include

    pid_t wait(int *stat_loc);

    pid_t waitpid(pid_t pid, int *stat_loc, int options);

    wait用于在父进程中调用,让父进程暂停执行等待子进程的结束,返回子进程的PID,如果stat_loc不是空指针,状态信息将被写入stat_loc指向的位置。

    waitpid等待进程id为pid的子进程的结束(pid为-1,将返回任一子进程的信息),stat_loc参数的作用与wait函数相同,options用于改变waitpid的行为,其中有一个很重要的选项WNOHANG,它的作用是防止waippid调用者的执行挂起。如果子进程没有结束或意外终止,它返回0,否则返回子进程的pid。

    改变后的程序保存为源文件new_ps_fork2.c,代码如下:

    #include

    #include

    #include

    #include

    int main()

    {

    pid_t pid = fork();

    int stat = 0;

    switch(pid)

    {

    case -1:

    perror("fork failed");

    exit(1);

    break;

    case 0:

    //这是在子进程中,调用execlp切换为ps进程

    printf("\n");

    execlp("ps", "ps", "au", 0);

    break;

    default:

    //这是在父进程中,等待子进程结束并输出相关提示信息

    pid = wait(&stat);

    printf("Child has finished: PID = %d\n", pid);

    //检查子进程的退出状态

    if(WIFEXITED(stat))

    printf("Child exited with code %d\n", WEXITSTATUS(stat));

    else

    printf("Child terminated abnormally\n");

    printf("Parent, ps Done\n");

    break;

    }

    exit(0);

    }

    输出为:

    可以看到这次的输出终于正常了,Parent的输出也在子进程的输出之后。

    总结——三种启动新进程方法的比较

    首先是最简单的system函数,它需要启动新的shell并在新的shell是执行子进程,所以对环境的依赖较大,而且效率也不高。同时system函数要等待子进程的返回才能执行下面的语句。

    exec系统函数是用新的进程来替换原先的进程,效率较高,但是它不会返回到原先的进程,也就是说在exec函数后面的所以代码都不会被执行,除非exec调用失败。然而exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但需要注意,任何在原进程中已打开的目录流都将在新进程中被关闭。

    fork则是用当前的进程来复制出一个新的进程,新进程与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境变量和文件描述符,我们通常根据fork函数的返回值来确定当前的进程是子进程还是父进程,即它并不像exec那样并不返回,而是返回一个pid_t的值用于判断,我们还可以继续执行fork后面的代码。感觉用fork与exec系列函数就能创建很多需的进程。

    以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

    展开全文
  • 有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法...
  • 本节主要学习两个问题: ...main函数是怎么启动的(被调用的): 当内核起动C程序时,在调用m a i n前先调用一个特殊的起动例程。可执行程序文件将此起动例程指定为程序的起始地址——这是由连接编辑程序设置.
  • 命令行参数以及环境变量如何传递给程序;进程的存储空间布局形式;以及进程终止方式;进程的资源限制等问题。 一个典型的C程序总是从main开始执行 int main(argc,char* argv[]) 内核执行C程序时,其通过父进程采取...
  • 有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程启动其他的进程呢?在linux中提供了不少的方法来实现这一点,下面来介绍一下这些方法...
  • 进程刚开始启动的时候,需要获知进程运行的系统环境变量、进程的运行参数。这些常见做法是操作系统在开启进程前,保存到进程的虚拟空间的栈中的。假设系统的环境变量有:HOME=/home/user和PATH=/usr/bin,命令是 ...
  • linux守护进程的方式

    2020-02-22 22:21:49
    linux 守护进程守护进程 start-stop-daemocrond 守护进程 start-stop-daemo ...-S|–start – …  开启守护程序,并传递参数 -K|–stop    停止一个程序 -T|–status    得到程序的状态 -...
  • Linux下查看进程启动时的环境变量: 方法一:通过获取进程编号得到环境变量: root@192.168.98.128:~# ps aux|grep jira root 2341 25.3 55.0 758544 384956 pts/0 得到PID为:2341 查看该进程的环境变量命令如下: ...
  • Linux_进程学习笔记

    2020-04-13 09:33:14
    当内核启动C程序时,会调用main函数前调用特殊的启动函数来获取main函数的地址和传递main函数的参数,并且将这些信息填写到进程控制块中。 正常终止: (1)从main函数中返回 (2)在任意代码中调用 ...
  • Linux进程控制

    2017-05-25 18:13:02
    //,这里将要执行的命令作为参数传递给system函数,不需要自己来调用fork,exec,和waitpid,也不需要自己来处理错误,处理信号,(但是调用system效率低)调用成功,返回相应命令的退出状态码,如果无法启动shal
  • 进程基本过程是内核调用exec函数,调用C程序的启动历程exit,exit从内核获取环境表及参数传递给main。大致如下 内核exec-》exit(main(arg,argv)); 二、 进程终止 1. 正常终止: (1)main返回 (2)调用c 函数...
  • 运行一个新进程,即在一个程序中启动另一个程序,可以使用system库函数,运行以字符串参数传递给它的命令并等待该命令的完成。 system("ps ax"); 相当于在命令行输入ps ax,但如果想让这个进程后台运行,可以把上述...
  • 启动进程 3.监控进程,查看进程是否退出或者崩溃 4.若进程退出或者崩溃,重启程序。 5.支持sleep功能 6.进程若连续崩溃NUM_MAX次就进行相应的睡眠周期struct proc_struct proc: struct proc_ struct [mp: if(array) ...
  • Linux进程执行环境

    2020-11-14 02:49:34
    进程环境 进程的环境,主要是描述是对程序执行时,main函数...启动例程将命令行参数和环境变量从内核中获取,传递进程。 一个典型的C程序启动与终止: 可以看到,总是从一个C启动例程开始,由它启动main函数,而
  • linux关于进程的编程

    2016-04-05 23:12:00
    一.启动一个新进程 ... 运行以字符串参数的形式传递给它的命令并等待该命令的执行(会阻塞在这) 等同于$sh -c string 命令后加&,后台运行 2.替换进程映像 exec由一系列的函数组成,可以把...
  • ②:命令行参数如何传递给执行程序 ③:典型存储器布局的样式 ④:如何分配另外的存储空间 ⑤:进程如何使用环境变量 ⑥:各种不同的进程终止方式 ⑦:longjmp和setjmp函数以及它们与栈的交互作用 ⑧:进程的资源限制...
  • 1终端登录(Terminal ...系统管理员(the system adminstrator)创建一个文件 /etc/ttys,每一个登录终端都在该文件占一行,改行包含登录终端名,其他的参数则会传递给getty函数。 其中一个参数是终端的传输波特...
  • linux启动第一个应用程序init linux的运行顺序为uboot传递参数到内核,内核的第一个c编写的函数为start_kernel(),start_kernel来启动内核,最后到到rest_init()函数处完成内核启动过程。 rest_init()中启动第一个...
  • Linux学习-1进程

    2017-02-12 10:45:00
    Linux中,在一个程序的内部启动另外一个程序,从而创建一个新进程。 1.这个工作可以通过库函数system来完成。 #include<stdlib.h> int system (const char *string); system函数的作用是,运行以字符串...
  • 进程的结构、类型和调度 可以把进程看做是正在运行的程序。 进程结构:进程标识符、文件描述符、栈空间和环境变量(程序...system函数作用:运行以字符串参数的形式传递给它的命令并等待命令的完成。它很有用,
  • 进程的结构、类型和调度 可以把进程看做是正在运行的程序。 进程结构:进程标识符、文件描述符、栈空间和环境变量...system函数作用:运行以字符串参数的形式传递给它的命令并等待命令的完成。它很有用,但是
  • 如果你对以下问题非常感兴趣且自己确实欠缺下面的提问,那么我觉得你可以往下看,我也觉得你必要提升一下自己的核心知识储备...6 Linux终端下启动进程的过程是什么 7 为什么在Linux终端按ctrl+z,ctrl+\,ctrl+c进程就终
  • linux中shell 参数变量

    2013-04-15 17:08:00
    $# 传递给程序的总的参数数目$? 上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。$* 传递给程序的所有参数组成的字符串。$- 在Shell启动或使用set命令时提供选项$? 上一条命令执行...
  • C编译器调用链接器,链接器设置可执行程序文件的启动起始地址(启动例程),启动例程获得内核传递来的 命令行参数和环境变量值,为调用main函数做准备。【实际上该启动例程常用汇编语言编写】,如果将启动例程换做...
  •  这是启动例程的第二各作用,搜集环境表,然后传递给主函数。  环境表就是一个指针数组。  环境表   每个进程都有一个独立的环境表 初始的环境表继承自父进程 主函数可以带三个参数,第三个参数则是环境...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 232
精华内容 92
关键字:

linux启动进程传递参数

linux 订阅