_execvp.c

来自「minix操作系统最新版本(3.1.1)的源代码」· C语言 代码 · 共 74 行

C
74
字号
/*	execvp() - execute with PATH search and prepared arguments *							Author: Kees J. Bot *								21 Jan 1994 */#define _MINIX_SOURCE#define nil 0#define execve _execve#define execvp _execvp#define sbrk _sbrk#define stat _stat#include <stdlib.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <sys/stat.h>extern char * const **_penviron;	/* The default environment. */int execvp(const char *file, char * const *argv)/* Execute the file with a path search on $PATH, just like the shell.  The * search continues on the errors ENOENT (not there), and EACCES (file not * executable or leading directories protected.) * Unlike other execvp implementations there is no default path, and no shell * is started for scripts.  One is supposed to define $PATH, and use #!/bin/sh. */{	struct stat sb;	const char *path;		/* $PATH */	char *full;			/* Full name to try. */	char *f;	size_t full_size;	int err= ENOENT;		/* Error return on failure. */	if (strchr(file, '/') != nil || (path= getenv("PATH")) == nil)		path= "";	/* Compute the maximum length the full name may have, and align. */	full_size= strlen(path) + 1 + strlen(file) + 1 + sizeof(char *) - 1;	full_size&= ~(sizeof(char *) - 1);	/* Claim space. */	if ((full= (char *) sbrk(full_size)) == (char *) -1) {		errno= E2BIG;		return -1;	}	/* For each directory in the path... */	do {		f= full;		while (*path != 0 && *path != ':') *f++= *path++;		if (f > full) *f++= '/';		strcpy(f, file);		/* Stat first, small speed-up, better for ptrace. */		if (stat(full, &sb) == -1) continue;		(void) execve(full, argv, *_penviron);		/* Prefer more interesting errno values then "not there". */		if (errno != ENOENT) err= errno;		/* Continue only on some errors. */		if (err != ENOENT && err != EACCES) break;	} while (*path++ != 0);	(void) sbrk(-full_size);	errno= err;	return -1;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?