linux-C-模拟shell-execlp

 

execlp()

Execute a file

Synopsis:

#include <process.h>

int execlp( const char * file, 
            const char * arg0, 
            const char * arg1,
            … 
            const char * argn, 
            NULL );

Arguments:

file
Used to construct a pathname that identifies the new process image file. If the  fileargument contains a slash character, the  file argument is used as the pathname for the file. Otherwise, the path prefix for this file is obtained by a search of the directories passed as the environment variable  PATH.
arg0, …,  argn
Pointers to  NULL-terminated character strings. These strings constitute the argument list available to the new process image. Terminate the list terminated with a  NULL pointer. The  arg0 argument must point to a filename that's associated with the process.



  #include<unistd.h>  main()  {  execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);
  }


waitpid()

wait for process termination 

Function

 SYNOPSIS DESCRIPTION PARAMETERS RETURN VALUES CONFORMANCE MULTITHREAD SAFETY LEVEL PORTING ISSUES AVAILABILITY SEE ALSO 

SYNOPSIS

#include <sys/types.h>

#include <sys/wait.h>

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


DESCRIPTION

The waitpid() function lets the calling process obtain status information about one of its child processes. If status information is available for two or more child processes, the order in which their status is reported is unspecified. If more than one thread is suspended in waitpid() awaiting termination of the same process, exactly one thread returns the process status at the time of the target child process termination. The other threads return -1, with errno set to ECHILD.

If the calling process sets SIGCHLD to SIG_IGN, and the process has no unwaited for children that were transformed into zombie processes, the calling thread blocks until all of the children of the process terminate, at which time waitpid() returns -1 with errno set to ECHILD.

If the parent process terminates without waiting for all of its child processes to terminate, the remaining child processes are assigned a new parent process ID corresponding to a system-level process.


PARAMETERS

 

pid 

Specifies a set of child processes for which the status is requested:

If  pid is equal to -1, status is requested for any child process. In this respect,  waitpid() is equivalent to  wait(). If  pid is greater than 0, it specifies the process ID of a single child process for which status is requested. If  pid is 0, status is requested for any child process whose process group ID is equal to that of the calling process. This setting is not currently supported. If  pid is less than -1, status is requested for any child process whose process group ID is equal to the absolute value of  pid. This setting is not currently supported.
stat_loc 

Specifies the location to which the child process' exit status is stored. If NULL is passed, no exit status is returned. Otherwise, the following macros defined in <sys/wait.h> can be used to evaluate the returned status:

 

WIFEXITED(s) 

Evaluates to a non-zero value if status was returned for a child process that exited normally.

WEXITSTATUS(s) 

If the value of WIFEXITED(s) is non-zero, this macro evaluates to the low-order 8 bits of the status argument that the child process passed to exit() or _exit(), or to the value that the child process returned from main().

WIFSIGNALED(s) 

Evaluates to a non-zero value if status was returned for a child process that terminated due to receipt of a signal that was not caught.

WTERMSIG(s) 

If the value of WIFSIGNALED(s) is non-zero, this macro evaluates to the number of the signal that caused the termination of the child process.

WIFCORED(s) 

Evaluates to a non-zero value if status was returned for a child process that terminated due to receipt of a signal that was not caught, and whose default action is to dump core.

WCOREDUMP(s) 

Evaluates to a non-zero value if status was returned for a child process that terminated due to receipt of a signal that was not caught, and whose default action is to dump core.

WCORESIG(s) 

If the value of WIFCORED(s) is non-zero, this macro evaluates to the number of the signal that caused the termination of the child process.

WIFSTOPPED(s) 

Evaluates to a non-zero value if status was returned for a child process that is currently stopped.

WSTOPSIG(s) 

If the value of WIFSTOPPED(s) is non-zero, this macro evaluates to the number of the signal that caused the child process to stop.

 

options 

Is the bitwise inclusive-OR of zero or more of the following flags, defined in <sys/wait.h>:

 

WNOHANG 

The waitpid() function does not suspend execution of the calling thread if status is not immediately available for one of the child processes specified by pid.

WUNTRACED 

The status of any child processes specified by pid that are stopped, and whose status has not yet been reported since they stopped, is also reported to the requesting thread. This value is currently not supported, and is ignored.

 

 


RETURN VALUES

If waitpid() was invoked with WNOHANG set in options, and there are children specified by pid for which status is not available, waitpid() returns 0. If WNOHANG was not set,waitpid() returns the process ID of a child when the status of that child is available. Otherwise, it returns -1 and sets errno to one of the following values:

 

ECHILD 

The process or process group specified by pid does not exist or is not a child of the calling process.

EFAULT 

stat_loc is not a writable address.

EINTR 

The function was interrupted by a signal. The value of the location pointed to by stat_loc is undefined.

EINVAL 

The options argument is not valid.

ENOSYS 

pid specifies a process group (0 or less than -1), which is not currently supported.

 


CONFORMANCE

POSIX.1 (1996).


MULTITHREAD SAFETY LEVEL

Async-signals-safe.


PORTING ISSUES

The NuTCRACKER Platform converts the exit status of native Windows applications to UNIX format, which allows waitpid() to work correctly with either NuTCRACKER Platform or non-NuTCRACKER Platform processes.

The process ID passed to waitpid() should be one returned by a function in the MKS Toolkit UNIX APIs. Refer to Process Identification in the Windows Concepts chapter of the MKS Toolkit UNIX to Windows Porting Guide.


AVAILABILITY

MKS Toolkit for Professional Developers
MKS Toolkit for Enterprise Developers
MKS Toolkit for Enterprise Developers 64-Bit Edition


SEE ALSO

 

Functions:
_exit()_NutForkExecl()_NutForkExecle()_NutForkExeclp()_NutForkExeclpe()_NutForkExecv()_NutForkExecvp()_NutForkExecvpe()execl(), execle()execlp()execlpe()execv()execve()execvp()execvpe()exit()fork()vfork()wait()

 


MKS Toolkit 9.3 Documentation Build 6.



=========================================== deepfuture@deepfuture-laptop:~/private/mytest$ gcc -o test21 test21.c test21.c: In function ‘main’: test21.c:15: warning: incompatible implicit declaration of built-in function ‘strlen’ test21.c:26: warning: incompatible implicit declaration of built-in function ‘exit’ test21.c:28: warning: incompatible implicit declaration of built-in function ‘execlp’ test21.c:31: warning: incompatible implicit declaration of built-in function ‘exit’ test21.c:33: warning: incompatible implicit declaration of built-in function ‘exit’ test21.c:44: warning: incompatible implicit declaration of built-in function ‘exit’ deepfuture@deepfuture-laptop:~/private/mytest$ ./test21
##deepfuture.iteye.com~~ls
1     pvmtest   test20   testbswap  testmul.s    x ex.txt     test      test20.c    testbswap.s  testmutex    x.c gmon.out     test12.s  test21   test.c  testmutex.c  xx hello     test13    test21.c    test.c~  testpopen    xx.c hello.c      test13.c  test2.c   testmes  testpopen.c  xx.txt hello.o      test15    test6   testmes.c  testpvm1.c   xxx.txt hello.s      test15.c  test66   testmesrecv  testpvm2.c   xxxx.txt main     test19    test66.s    testmesrecv.c  testpx       xy main.c     test19.c  test6.c   testmessnd  testpx1 main.c~      test1.c   testasmc    testmessnd.c   testpx1.s myhello.txt  test2     testasmc.c  testmul  testpx.s
##deepfuture.iteye.com~~xx
不能执行:xx
##deepfuture.iteye.com~~Q
退出.... deepfuture@deepfuture-laptop:~/private/mytest$ 
#include <stdio.h>
#include <sys/wait.h>

#define MAXLINE 100
//execlp模拟SHELL

int main(void){
   int pid;
   int jg,status,len;
   char buf[MAXLINE];

   printf("\n##deepfuture.iteye.com~~");//自定义的shell提示符
   while(fgets(buf,MAXLINE,stdin)!=NULL){//读入一行
        len=strlen(buf)-1;
        if (buf[len]=='\n'){        //去除换行符,execlp只接受以NULL结尾
            buf[len]=0;            
        }
        pid=fork();
        if (pid<0){
           printf("fork error!\n");
        }
        else if (pid==0){//子进程
           printf("\n");        
           if (buf[0]=='Q'&&strlen(buf)==1){//键入Q表示退出shell          
               exit(200); 
           }
           jg=execlp(buf,buf,(char *)0);
           if (jg==-1){//错误
              printf("不能执行:%s\n",buf);    
              exit(127);          
           }              
              exit(0);       
        }
        if ((jg==waitpid(pid,&status,0))<0){//父进程
            printf("waitpid error\n");
        }
        if (WEXITSTATUS(status)==200) {//WEXITSTATUS计算返回值
                printf("退出....\n");  
                break;          
        }
        printf("\n##deepfuture.iteye.com~~");//自定义的shell提示符
   }
exit(0);
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值