📄 posixmodule.c
字号:
static const char posix_getgid__doc__[] =
"getgid() -> gid\n\
Return the current process's group id.";
static PyObject *
posix_getgid(PyObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, ":getgid"))
return NULL;
return PyInt_FromLong((long)getgid());
}
#endif
static const char posix_getpid__doc__[] =
#ifndef SYMBIAN
"getpid() -> pid\n\
Return the current process id";
#else
"";
#endif
static PyObject *
posix_getpid(PyObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, ":getpid"))
return NULL;
return PyInt_FromLong((long)getpid());
}
#ifdef HAVE_GETGROUPS
static const char posix_getgroups__doc__[] = "\
getgroups() -> list of group IDs\n\
Return list of supplemental group IDs for the process.";
static PyObject *
posix_getgroups(PyObject *self, PyObject *args)
{
PyObject *result = NULL;
if (PyArg_ParseTuple(args, ":getgroups")) {
#ifdef NGROUPS_MAX
#define MAX_GROUPS NGROUPS_MAX
#else
/* defined to be 16 on Solaris7, so this should be a small number */
#define MAX_GROUPS 64
#endif
gid_t grouplist[MAX_GROUPS];
int n;
n = getgroups(MAX_GROUPS, grouplist);
if (n < 0)
posix_error();
else {
result = PyList_New(n);
if (result != NULL) {
PyObject *o;
int i;
for (i = 0; i < n; ++i) {
o = PyInt_FromLong((long)grouplist[i]);
if (o == NULL) {
Py_DECREF(result);
result = NULL;
break;
}
PyList_SET_ITEM(result, i, o);
}
}
}
}
return result;
}
#endif
#ifdef HAVE_GETPGRP
static const char posix_getpgrp__doc__[] =
"getpgrp() -> pgrp\n\
Return the current process group id.";
static PyObject *
posix_getpgrp(PyObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, ":getpgrp"))
return NULL;
#ifdef GETPGRP_HAVE_ARG
return PyInt_FromLong((long)getpgrp(0));
#else /* GETPGRP_HAVE_ARG */
return PyInt_FromLong((long)getpgrp());
#endif /* GETPGRP_HAVE_ARG */
}
#endif /* HAVE_GETPGRP */
#ifdef HAVE_SETPGRP
static const char posix_setpgrp__doc__[] =
"setpgrp() -> None\n\
Make this process a session leader.";
static PyObject *
posix_setpgrp(PyObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, ":setpgrp"))
return NULL;
#ifdef SETPGRP_HAVE_ARG
if (setpgrp(0, 0) < 0)
#else /* SETPGRP_HAVE_ARG */
if (setpgrp() < 0)
#endif /* SETPGRP_HAVE_ARG */
return posix_error();
Py_INCREF(Py_None);
return Py_None;
}
#endif /* HAVE_SETPGRP */
#ifdef HAVE_GETPPID
static const char posix_getppid__doc__[] =
"getppid() -> ppid\n\
Return the parent's process id.";
static PyObject *
posix_getppid(PyObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, ":getppid"))
return NULL;
return PyInt_FromLong((long)getppid());
}
#endif
#ifdef HAVE_GETLOGIN
static const char posix_getlogin__doc__[] = "\
getlogin() -> string\n\
Return the actual login name.";
static PyObject *
posix_getlogin(PyObject *self, PyObject *args)
{
PyObject *result = NULL;
if (PyArg_ParseTuple(args, ":getlogin")) {
char *name;
int old_errno = errno;
errno = 0;
name = getlogin();
if (name == NULL) {
if (errno)
posix_error();
else
PyErr_SetString(PyExc_OSError,
"unable to determine login name");
}
else
result = PyString_FromString(name);
errno = old_errno;
}
return result;
}
#endif
#ifdef HAVE_GETUID
static const char posix_getuid__doc__[] =
"getuid() -> uid\n\
Return the current process's user id.";
static PyObject *
posix_getuid(PyObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, ":getuid"))
return NULL;
return PyInt_FromLong((long)getuid());
}
#endif
#ifdef HAVE_KILL
static const char posix_kill__doc__[] =
"kill(pid, sig) -> None\n\
Kill a process with a signal.";
static PyObject *
posix_kill(PyObject *self, PyObject *args)
{
int pid, sig;
if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
return NULL;
#if defined(PYOS_OS2)
if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
APIRET rc;
if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
return os2_error(rc);
} else if (sig == XCPT_SIGNAL_KILLPROC) {
APIRET rc;
if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
return os2_error(rc);
} else
return NULL; /* Unrecognized Signal Requested */
#else
if (kill(pid, sig) == -1)
return posix_error();
#endif
Py_INCREF(Py_None);
return Py_None;
}
#endif
#ifdef HAVE_PLOCK
#ifdef HAVE_SYS_LOCK_H
#include <sys/lock.h>
#endif
static const char posix_plock__doc__[] =
"plock(op) -> None\n\
Lock program segments into memory.";
static PyObject *
posix_plock(PyObject *self, PyObject *args)
{
int op;
if (!PyArg_ParseTuple(args, "i:plock", &op))
return NULL;
if (plock(op) == -1)
return posix_error();
Py_INCREF(Py_None);
return Py_None;
}
#endif
#ifdef HAVE_POPEN
static const char posix_popen__doc__[] =
"popen(command [, mode='r' [, bufsize]]) -> pipe\n\
Open a pipe to/from a command returning a file object.";
#if defined(PYOS_OS2)
static int
async_system(const char *command)
{
char *p, errormsg[256], args[1024];
RESULTCODES rcodes;
APIRET rc;
char *shell = getenv("COMSPEC");
if (!shell)
shell = "cmd";
strcpy(args, shell);
p = &args[ strlen(args)+1 ];
strcpy(p, "/c ");
strcat(p, command);
p += strlen(p) + 1;
*p = '\0';
rc = DosExecPgm(errormsg, sizeof(errormsg),
EXEC_ASYNC, /* Execute Async w/o Wait for Results */
args,
NULL, /* Inherit Parent's Environment */
&rcodes, shell);
return rc;
}
static FILE *
popen(const char *command, const char *mode, int pipesize, int *err)
{
HFILE rhan, whan;
FILE *retfd = NULL;
APIRET rc = DosCreatePipe(&rhan, &whan, pipesize);
if (rc != NO_ERROR) {
*err = rc;
return NULL; /* ERROR - Unable to Create Anon Pipe */
}
if (strchr(mode, 'r') != NULL) { /* Treat Command as a Data Source */
int oldfd = dup(1); /* Save STDOUT Handle in Another Handle */
DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
close(1); /* Make STDOUT Available for Reallocation */
if (dup2(whan, 1) == 0) { /* Connect STDOUT to Pipe Write Side */
DosClose(whan); /* Close Now-Unused Pipe Write Handle */
rc = async_system(command);
}
dup2(oldfd, 1); /* Reconnect STDOUT to Original Handle */
DosExitCritSec(); /* Now Allow Other Threads to Run */
if (rc == NO_ERROR)
retfd = fdopen(rhan, mode); /* And Return Pipe Read Handle */
close(oldfd); /* And Close Saved STDOUT Handle */
return retfd; /* Return fd of Pipe or NULL if Error */
} else if (strchr(mode, 'w')) { /* Treat Command as a Data Sink */
int oldfd = dup(0); /* Save STDIN Handle in Another Handle */
DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
close(0); /* Make STDIN Available for Reallocation */
if (dup2(rhan, 0) == 0) { /* Connect STDIN to Pipe Read Side */
DosClose(rhan); /* Close Now-Unused Pipe Read Handle */
rc = async_system(command);
}
dup2(oldfd, 0); /* Reconnect STDIN to Original Handle */
DosExitCritSec(); /* Now Allow Other Threads to Run */
if (rc == NO_ERROR)
retfd = fdopen(whan, mode); /* And Return Pipe Write Handle */
close(oldfd); /* And Close Saved STDIN Handle */
return retfd; /* Return fd of Pipe or NULL if Error */
} else {
*err = ERROR_INVALID_ACCESS;
return NULL; /* ERROR - Invalid Mode (Neither Read nor Write) */
}
}
static PyObject *
posix_popen(PyObject *self, PyObject *args)
{
char *name;
char *mode = "r";
int err, bufsize = -1;
FILE *fp;
PyObject *f;
if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
return NULL;
Py_BEGIN_ALLOW_THREADS
fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err);
Py_END_ALLOW_THREADS
if (fp == NULL)
return os2_error(err);
f = PyFile_FromFile(fp, name, mode, fclose);
if (f != NULL)
PyFile_SetBufSize(f, bufsize);
return f;
}
#elif defined(MS_WIN32)
/*
* Portable 'popen' replacement for Win32.
*
* Written by Bill Tutt <billtut@microsoft.com>. Minor tweaks
* and 2.0 integration by Fredrik Lundh <fredrik@pythonware.com>
* Return code handling by David Bolen <db3l@fitlinxx.com>.
*/
#include <malloc.h>
#include <io.h>
#include <fcntl.h>
/* These tell _PyPopen() wether to return 1, 2, or 3 file objects. */
#define POPEN_1 1
#define POPEN_2 2
#define POPEN_3 3
#define POPEN_4 4
static PyObject *_PyPopen(char *, int, int);
static int _PyPclose(FILE *file);
/*
* Internal dictionary mapping popen* file pointers to process handles,
* for use when retrieving the process exit code. See _PyPclose() below
* for more information on this dictionary's use.
*/
static PyObject *_PyPopenProcs = NULL;
/* popen that works from a GUI.
*
* The result of this function is a pipe (file) connected to the
* processes stdin or stdout, depending on the requested mode.
*/
static PyObject *
posix_popen(PyObject *self, PyObject *args)
{
PyObject *f, *s;
int tm = 0;
char *cmdstring;
char *mode = "r";
int bufsize = -1;
if (!PyArg_ParseTuple(args, "s|si:popen", &cmdstring, &mode, &bufsize))
return NULL;
s = PyTuple_New(0);
if (*mode == 'r')
tm = _O_RDONLY;
else if (*mode != 'w') {
PyErr_SetString(PyExc_ValueError, "popen() arg 2 must be 'r' or 'w'");
return NULL;
} else
tm = _O_WRONLY;
if (bufsize != -1) {
PyErr_SetString(PyExc_ValueError, "popen() arg 3 must be -1");
return NULL;
}
if (*(mode+1) == 't')
f = _PyPopen(cmdstring, tm | _O_TEXT, POPEN_1);
else if (*(mode+1) == 'b')
f = _PyPopen(cmdstring, tm | _O_BINARY, POPEN_1);
else
f = _PyPopen(cmdstring, tm | _O_TEXT, POPEN_1);
return f;
}
/* Variation on win32pipe.popen
*
* The result of this function is a pipe (file) connected to the
* process's stdin, and a pipe connected to the process's stdout.
*/
static PyObject *
win32_popen2(PyObject *self, PyObject *args)
{
PyObject *f;
int tm=0;
char *cmdstring;
char *mode = "t";
int bufsize = -1;
if (!PyArg_ParseTuple(args, "s|si:popen2", &cmdstring, &mode, &bufsize))
return NULL;
if (*mode == 't')
tm = _O_TEXT;
else if (*mode != 'b') {
PyErr_SetString(PyExc_ValueError, "popen2() arg 2 must be 't' or 'b'");
return NULL;
} else
tm = _O_BINARY;
if (bufsize != -1) {
PyErr_SetString(PyExc_ValueError, "popen2() arg 3 must be -1");
return NULL;
}
f = _PyPopen(cmdstring, tm, POPEN_2);
return f;
}
/*
* Variation on <om win32pipe.popen>
*
* The result of this function is 3 pipes - the process's stdin,
* stdout and stderr
*/
static PyObject *
win32_popen3(PyObject *self, PyObject *args)
{
PyObject *f;
int tm = 0;
char *cmdstring;
char *mode = "t";
int bufsize = -1;
if (!PyArg_ParseTuple(args, "s|si:popen3", &cmdstring, &mode, &bufsize))
return NULL;
if (*mode == 't')
tm = _O_TEXT;
else if (*mode != 'b') {
PyErr_SetString(PyExc_ValueError, "popen3() arg 2 must be 't' or 'b'");
return NULL;
} else
tm = _O_BINARY;
if (bufsize != -1) {
PyErr_SetString(PyExc_ValueError, "popen3() arg 3 must be -1");
return NULL;
}
f = _PyPopen(cmdstring, tm, POPEN_3);
return f;
}
/*
* Variation on win32pipe.popen
*
* The result of this function is 2 pipes - the processes stdin,
* and stdout+stderr combined as a single pipe.
*/
static PyObject *
win32_popen4(PyObject *self, PyObject *args)
{
PyObject *f;
int tm = 0;
char *cmdstring;
char *mode = "t";
int bufsize = -1;
if (!PyArg_ParseTuple(args, "s|si:popen4", &cmdstring, &mode, &bufsize))
return NULL;
if (*mode == 't')
tm = _O_TEXT;
else if (*mode != 'b') {
PyErr_SetString(PyExc_ValueError, "popen4() arg 2 must be 't' or 'b'");
return NULL;
} else
tm = _O_BINARY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -