2015-03-13 79 views
0

我把示例程序从Advanced Linux Programming网站:分叉和执行程序不会返回到控制台

/*********************************************************************** 
* Code listing from "Advanced Linux Programming," by CodeSourcery LLC * 
* Copyright (C) 2001 by New Riders Publishing       * 
* See COPYRIGHT for license information.        * 
***********************************************************************/ 

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

/* Spawn a child process running a new program. PROGRAM is the name 
    of the program to run; the path will be searched for this program. 
    ARG_LIST is a NULL-terminated list of character strings to be 
    passed as the program's argument list. Returns the process id of 
    the spawned process. */ 

int spawn (char* program, char** arg_list) 
{ 
    pid_t child_pid; 

    /* Duplicate this process. */ 
    child_pid = fork(); 
    if (child_pid != 0) 
    /* This is the parent process. */ 
    return child_pid; 
    else { 
    /* Now execute PROGRAM, searching for it in the path. */ 
    execvp (program, arg_list); 
    /* The execvp function returns only if an error occurs. */ 
    fprintf (stderr, "an error occurred in execvp\n"); 
    abort(); 
    } 
} 

int main() 
{ 
    /* The argument list to pass to the "ls" command. */ 
    char* arg_list[] = { 
    "ls",  /* argv[0], the name of the program. */ 
    "-l", 
    "/", 
    NULL  /* The argument list must end with a NULL. */ 
    }; 

    /* Spawn a child process running the "ls" command. Ignore the 
    returned child process id. */ 
    spawn ("ls", arg_list); 

    printf ("done with main program\n"); 

    return 0; 
} 

编译和从控制台运行它之后,子进程不会退出,因此不会释放安慰。

只有Ctrl + C有助于返回控制台。

[email protected] ~/Projects/test $ gcc -o test test.c 
[email protected] ~/Projects/test $ ./test 
done with main program 
[email protected] ~/Projects/test $ total 104 
drwxr-xr-x 2 root root 4096 Mar 11 11:57 bin 
drwxr-xr-x 3 root root 4096 Mar 11 11:57 boot 
[ ... too many lines of my filesystem skipped ... ] 
drwxr-xr-x 10 root root 4096 Nov 27 01:12 usr 
drwxr-xr-x 11 root root 4096 Nov 27 01:48 var 
^C 
[email protected] ~/Projects/test $ 

如何运行另一程序并退出到控制台?

回答

2

完成第一个程序,无需等待子进程完成。 shell给你一个提示,但是然后ls -l命令的输出开始了。

当你点击中断时shell仍在等待你;如果您输入echo Hi,它会完成您的出价。

这是你的样本输出,注释:

[email protected] ~/Projects/test $ gcc -o test test.c 
[email protected] ~/Projects/test $ ./test 
done with main program 
[email protected] ~/Projects/test $ total 104 

前一行有你的提示,并且还输出从ls -l第一线。

drwxr-xr-x 2 root root 4096 Mar 11 11:57 bin 
drwxr-xr-x 3 root root 4096 Mar 11 11:57 boot 
[ ... too many lines of my filesystem skipped ... ] 
drwxr-xr-x 10 root root 4096 Nov 27 01:12 usr 
drwxr-xr-x 11 root root 4096 Nov 27 01:48 var 
^C 

如果你输入的echo Hi代替控制-C,你会看到Hi和下一个提示。就像您在中断外壳后得到下一个提示...

[email protected] ~/Projects/test $ 
相关问题