add a flags parameter to select.epoll
diff --git a/Doc/library/select.rst b/Doc/library/select.rst
index 72fba73..d9d802b 100644
--- a/Doc/library/select.rst
+++ b/Doc/library/select.rst
@@ -39,12 +39,19 @@
 
    .. versionadded:: 3.3
 
-.. function:: epoll(sizehint=-1)
+.. function:: epoll(sizehint=-1, flags=0)
 
-   (Only supported on Linux 2.5.44 and newer.)  Returns an edge polling object,
-   which can be used as Edge or Level Triggered interface for I/O events; see
-   section :ref:`epoll-objects` below for the methods supported by epolling
-   objects.
+   (Only supported on Linux 2.5.44 and newer.) Return an edge polling object,
+   which can be used as Edge or Level Triggered interface for I/O
+   events. *sizehint* is deprecated and completely ignored. *flags* can be set
+   to :const:`EPOLL_CLOEXEC`, which causes the epoll descriptor to be closed
+   automatically when :func:`os.execve` is called. See section
+   :ref:`epoll-objects` below for the methods supported by epolling objects.
+
+
+   .. versionchanged:: 3.3
+
+      Added the *flags* parameter.
 
 
 .. function:: poll()
diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py
index 275e598..b899b6e 100644
--- a/Lib/test/test_epoll.py
+++ b/Lib/test/test_epoll.py
@@ -74,6 +74,8 @@
         ep.close()
         self.assertTrue(ep.closed)
         self.assertRaises(ValueError, ep.fileno)
+        select.epoll(select.EPOLL_CLOEXEC).close()
+        self.assertRaises(OSError, select.epoll, flags=12356)
 
     def test_badcreate(self):
         self.assertRaises(TypeError, select.epoll, 1, 2, 3)
diff --git a/Misc/NEWS b/Misc/NEWS
index 1dc721a..43e2637 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -422,6 +422,8 @@
 Library
 -------
 
+- Add a flags parameter to select.epoll.
+
 - Issue #12798: Updated the mimetypes documentation.
 
 - Issue #13626: Add support for SSL Diffie-Hellman key exchange, through the
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
index 5d5e772..6e3e6cb 100644
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -1087,20 +1087,10 @@
 }
 
 static PyObject *
-newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
+newPyEpoll_Object(PyTypeObject *type, int flags, SOCKET fd)
 {
     pyEpoll_Object *self;
 
-    if (sizehint == -1) {
-        sizehint = FD_SETSIZE-1;
-    }
-    else if (sizehint < 1) {
-        PyErr_Format(PyExc_ValueError,
-                     "sizehint must be greater zero, got %d",
-                     sizehint);
-        return NULL;
-    }
-
     assert(type != NULL && type->tp_alloc != NULL);
     self = (pyEpoll_Object *) type->tp_alloc(type, 0);
     if (self == NULL)
@@ -1108,7 +1098,7 @@
 
     if (fd == -1) {
         Py_BEGIN_ALLOW_THREADS
-        self->epfd = epoll_create(sizehint);
+        self->epfd = epoll_create1(flags);
         Py_END_ALLOW_THREADS
     }
     else {
@@ -1126,14 +1116,18 @@
 static PyObject *
 pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
-    int sizehint = -1;
-    static char *kwlist[] = {"sizehint", NULL};
+    int flags = 0, sizehint = 0;
+    static char *kwlist[] = {"sizehint", "flags", NULL};
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:epoll", kwlist,
-                                     &sizehint))
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii:epoll", kwlist,
+                                     &sizehint, &flags))
         return NULL;
+    if (sizehint < 0) {
+        PyErr_SetString(PyExc_ValueError, "negative sizehint");
+        return NULL;
+    }
 
-    return newPyEpoll_Object(type, sizehint, -1);
+    return newPyEpoll_Object(type, flags, -1);
 }
 
 
@@ -1191,7 +1185,7 @@
     if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
         return NULL;
 
-    return newPyEpoll_Object((PyTypeObject*)cls, -1, fd);
+    return newPyEpoll_Object((PyTypeObject*)cls, 0, fd);
 }
 
 PyDoc_STRVAR(pyepoll_fromfd_doc,
@@ -1420,7 +1414,7 @@
 };
 
 PyDoc_STRVAR(pyepoll_doc,
-"select.epoll([sizehint=-1])\n\
+"select.epoll(sizehint=-1, flags=0)\n\
 \n\
 Returns an epolling object\n\
 \n\
@@ -2218,6 +2212,8 @@
     PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM);
     PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
     PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
+
+    PyModule_AddIntConstant(m, "EPOLL_CLOEXEC", EPOLL_CLOEXEC);
 #endif /* HAVE_EPOLL */
 
 #ifdef HAVE_KQUEUE