Sometimes, two scripts need to communicate some information between themselves via two processes. In Unix/Linux, there's a concept of connected socket, of socketpair
. We can experiment with this here.
This recipe is designed for a Unix/Linux host. Windows/Mac is not suitable for running this one.
We use a test_socketpair()
function to wrap a few lines that test the socket's socketpair()
function.
List 3.8 shows an example of socketpair
, as follows:
#!/usr/bin/env python # Python Network Programming Cookbook -- Chapter – 3 # This program is optimized for Python 2.7. # It may run on any other version with/without modifications. import socket import os BUFSIZE = 1024 def test_socketpair(): """ Test Unix socketpair""" parent, child = socket.socketpair() pid = os.fork() try: if pid: print "@Parent, sending message..." child.close() parent.sendall("Hello from parent!") response = parent.recv(BUFSIZE) print "Response from child:", response parent.close() else: print "@Child, waiting for message from parent" parent.close() message = child.recv(BUFSIZE) print "Message from parent:", message child.sendall("Hello from child!!") child.close() except Exception, err: print "Error: %s" %err if __name__ == '__main__': test_socketpair()
The output from the preceding script is as follows:
$ python 3_8_ipc_using_socketpairs.py @Parent, sending message... @Child, waiting for message from parent Message from parent: Hello from parent! Response from child: Hello from child!!
The socket.socketpair()
function simply returns two connected socket objects. In our case, we can say that one is a parent and another is a child. We fork another process via a os.fork()
call. This returns the process ID of the parent. In each process, the other process' socket is closed first and then a message is exchanged via a sendall()
method call on the process's socket. The try-except block prints any error in case of any kind of exception.
3.145.33.235