1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
#! /usr/bin/env lua
--[[
This example tests sched_setscheduler() / sched_getscheduler()
The script must be run as privileged process (CAP_SYS_NICE on linux)
]]
local M = require 'posix.sched'
local mypid = require 'posix.unistd'.getpid()
-- get sched params from ps(1)
local function get_ps_sched(pid)
local fp = io.popen(string.format('ps --no-headers -o "policy,rtprio" %s', pid))
local res, err = fp:read'*a'
assert(res, err)
fp:close()
local policy, rtprio = string.match(res, '([^%s]+)%s+([^%s]+)')
assert(policy)
assert(rtprio)
return policy, rtprio
end
do -- Tests on own process
-- get scheduler policy for own process
local res, err = M.sched_getscheduler(0) -- 0 pid: own process
assert(res == M.SCHED_OTHER)
local res, err = M.sched_getscheduler() -- default pid: own process
assert(res == M.SCHED_OTHER)
local policy, rtprio = get_ps_sched(mypid)
assert(policy== 'TS')
assert(rtprio== '-')
-- set realtime priority on own process : SCHED_FIFO
local res, err = M.sched_setscheduler(0, p.SCHED_FIFO, 10 )
assert(res, err)
local policy, rtprio = get_ps_sched(mypid)
assert(policy == 'FF')
assert(rtprio == '10')
local res, err = M.sched_getscheduler(0)
assert(res == M.SCHED_FIFO)
-- set realtime priority on own process SCHED_RR
local res, err = M.sched_setscheduler(0, M.SCHED_RR, 11 )
assert(res, err)
local policy, rtprio = get_ps_sched(mypid)
assert(policy == 'RR')
assert(rtprio == '11')
local res, err = M.sched_getscheduler(0)
assert(res == M.SCHED_RR)
-- no parameters: reset own process to normal priority :
local res, err = M.sched_setscheduler()
assert(res, err)
local policy, rtprio = get_ps_sched(mypid)
assert(policy == 'TS')
assert(rtprio == '-')
local res, err = M.sched_getscheduler(0)
assert(res == M.SCHED_OTHER)
end
-- fork a child to check sched_setscheduler on other process
do
local U = require 'posix.unistd'
local r, w = U.pipe()
local childpid = U.fork()
if childpid == 0 then
-- child: block on pipe until parent is finshed
U.close(w) -- close unused write end
local b = U.read(r,1)
U._exit(0)
end
-- parent:
U.close(r)
do -- do tests
-- get scheduler policy for child process
local res, err = M.sched_getscheduler(childpid)
assert(res == M.SCHED_OTHER)
local policy, rtprio = get_ps_sched(childpid)
assert(policy == 'TS')
assert(rtprio == '-')
-- set realtime priority on child process : SCHED_FIFO
local res, err = M.sched_setscheduler(childpid, M.SCHED_FIFO, 10 )
assert(res, err)
local policy, rtprio = get_ps_sched(childpid)
assert(policy == 'FF')
assert(rtprio == '10')
local res, err = M.sched_getscheduler(childpid)
assert(res == M.SCHED_FIFO)
-- set realtime priority on child process SCHED_RR
local res, err = M.sched_setscheduler(childpid, M.SCHED_RR, 11 )
assert(res, err)
local policy, rtprio = get_ps_sched(childpid)
assert(policy == 'RR')
assert(rtprio == '11')
local res, err = M.sched_getscheduler(childpid)
assert(res == M.SCHED_RR)
-- no parameters after pid: reset child process to normal priority :
local res, err = M.sched_setscheduler(childpid)
assert(res, err)
local policy, rtprio = get_ps_sched(childpid)
assert(policy == 'TS')
assert(rtprio == '-')
local res, err = M.sched_getscheduler(childpid)
assert(res == M.SCHED_OTHER)
end
-- stop child
U.write(w, 'stop')
U.close(w)
require 'posix.sys.wait'.wait(childpid)
end
|