Throw control-c to @spawn task?

Is there a way to throw a control-c break to a task running as @spawn? The specific case is that, when running the SoX commandline music player, one sends control-c to tell the player to stop play, ie

p = @spawn(run(`play $args`))

and, now I might want to stop the music early.

Making control-c work with @spawn is a very hard problem.

But I don’t think you need @spawn here. Why not just use p = run(`play $args`; wait=false)? You can then kill(p).

@spawn or not, if you are talking about sending a Control-C to the subprocess you are actually talking about sending a SIGINT to the subprocess. Sending a interupt (however you interpret that) to the task you forked off won’t do anything.

In another word, all what you need is kill(process, Base.SIGINT) you just need to figure out a way to get tha process object and you can pick you way to do it whether you want to use @spawn or not.

I think I will use this, though what I would ideally like is what mimics on the command line:

pkill -STOP play
pkill -CONT play

to pause and continue. But kill(p) will work, enough.

You can change what signal you send

You can see that kill accept the second argument which defaults to SIGTERM: https://docs.julialang.org/en/latest/base/base/#Base.kill-Tuple{Base.Process,Integer}

Julia’s Base does not define SIGCONT and SIGSTOP (not cross-platform?) but it looks like they are 18 and 19, respectively.

(Edit: oops @yuyichao was faster)

Ah, did not know that, thanks.