Job control shells manipulate sessions or process groups all the time. You can send the same signal to all the processes in a process group with a single call to the POSIX kill()
function.
The POSIX standard says:
If pid is greater than 0, sig shall be sent to the process whose process ID is equal to pid.
If pid is 0, sig shall be sent to all processes (excluding an unspecified set of system processes) whose process group ID is equal to the process group ID of the sender, and for which the process has permission to send a signal.
If pid is -1, sig shall be sent to all processes (excluding an unspecified set of system processes) for which the process has permission to send that signal.
If pid is negative, but not -1, sig shall be sent to all processes (excluding an unspecified set of system processes) whose process group ID is equal to the absolute value of pid, and for which the process has permission to send a signal.
When a login shell exits, for example, a SIGHUP signal is sent to all programs in its process group.
When you manipulate programs into foreground or background, you are using process groups.
There are also controlling terminals to worry about; signals generated by a controlling terminal can be sent to all programs in a process group.