+int
+signal_send(pid_t pid, int signum)
+{
+ if (signum < 0 || signum >= _SIG_NUM) {
+ __current->k_status = LXINVL;
+ return -1;
+ }
+
+ struct proc_info* proc;
+ if (pid > 0) {
+ proc = get_process(pid);
+ goto send_single;
+ } else if (!pid) {
+ proc = __current;
+ goto send_grp;
+ } else if (pid < -1) {
+ proc = get_process(-pid);
+ goto send_grp;
+ } else {
+ // TODO: send to all process.
+ // But I don't want to support it yet.
+ __current->k_status = LXINVL;
+ return -1;
+ }
+
+send_grp:
+ struct proc_info *pos, *n;
+ llist_for_each(pos, n, &proc->grp_member, grp_member)
+ {
+ __SIGSET(pos->sig_pending, signum);
+ }
+ return 0;
+
+send_single:
+ if (PROC_TERMINATED(proc->state)) {
+ __current->k_status = LXINVL;
+ return -1;
+ }
+ __SIGSET(proc->sig_pending, signum);
+ return 0;
+}
+