zoukankan      html  css  js  c++  java
  • Linux中的system函数的实现和解释

    #include	<sys/wait.h>
    #include	<errno.h>
    #include	<signal.h>
    #include	<unistd.h>
    
    int
    system(const char *cmdstring)	/* with appropriate signal handling */
    {
    	pid_t				pid;
    	int					status;
    	struct sigaction	ignore, saveintr, savequit;
    	sigset_t			chldmask, savemask;
    
    	if (cmdstring == NULL)
    		return(1);		/* always a command processor with UNIX */
    
    	ignore.sa_handler = SIG_IGN;	/* ignore SIGINT and SIGQUIT */
    	sigemptyset(&ignore.sa_mask);
    	ignore.sa_flags = 0;
    	if (sigaction(SIGINT, &ignore, &saveintr) < 0)
    		return(-1);
    	if (sigaction(SIGQUIT, &ignore, &savequit) < 0)
    		return(-1);
    	sigemptyset(&chldmask);			/* now block SIGCHLD */
    	sigaddset(&chldmask, SIGCHLD);
    	if (sigprocmask(SIG_BLOCK, &chldmask, &savemask) < 0)
    		return(-1);
    
    	if ((pid = fork()) < 0) {
    		status = -1;	/* probably out of processes */
    	} else if (pid == 0) {			/* child */
    		/* restore previous signal actions & reset signal mask */
    		sigaction(SIGINT, &saveintr, NULL);
    		sigaction(SIGQUIT, &savequit, NULL);
    		sigprocmask(SIG_SETMASK, &savemask, NULL);
    
    		execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
    		_exit(127);		/* exec error */
    	} else {						/* parent */
    		while (waitpid(pid, &status, 0) < 0)
    			if (errno != EINTR) {
    				status = -1; /* error other than EINTR from waitpid() */
    				break;
    			}
    	}
    
    	/* restore previous signal actions & reset signal mask */
    	if (sigaction(SIGINT, &saveintr, NULL) < 0)
    		return(-1);
    	if (sigaction(SIGQUIT, &savequit, NULL) < 0)
    		return(-1);
    	if (sigprocmask(SIG_SETMASK, &savemask, NULL) < 0)
    		return(-1);
    
    	return(status);
    }
    


  • 相关阅读:
    老周的ABP框架系列教程 -》 一、框架理论初步学习
    poi读写Excel记录
    get 和 post 请求的区别,一个不错的链接
    PostgreSQL的WAL日志概述与Full-Page Writes
    linux挂载硬盘到home目录下(home目录扩容)
    高可用的恢复点目标(RPO)和恢复时间目标(RTO)
    iscsi常用命令汇总
    如何同步linux集群时间
    内部类
    抽象和继承
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3029630.html
Copyright © 2011-2022 走看看