簡體   English   中英

Eiffel:我如何進行系統調用?

[英]Eiffel: how do I do a system call?

我想用bzip2 myFile.bz2解壓縮文件,我必須使用哪個類?

我試圖在對我來說最有意義的 基本內核文檔中找到它,但沒有找到它

這有效:

    make
        local
            l_env:EXECUTION_ENVIRONMENT
        do
            create l_env
            l_env.system ("bzip2 test.txt")
        end

我使用管道在 linux 上工作的最終解決方案如下:

feature -- Commands

    piped_command_result (a_command: STRING): detachable PROCESS_COMMAND_RESULT
            -- https://groups.google.com/forum/#!topic/eiffel-users/O9KEtBSPrf4
        local
            l_cmd: READABLE_STRING_32
            l_args: ARRAYED_LIST [READABLE_STRING_32]
            l_proc: like {BASE_PROCESS_FACTORY}.process_launcher
            l_err, l_res: STRING
            l_err_spec, l_res_spec: SPECIAL [NATURAL_8]
        do
            create l_res.make (0)
            create l_err.make (0)
            create l_res_spec.make_filled (0, 1024)
            create l_err_spec.make_filled (0, 1024)

            l_cmd := (create {EXECUTION_ENVIRONMENT}).default_shell
            if l_cmd.is_empty then
            l_cmd := {STRING_32} "/bin/bash" -- or either "/bin/sh"
            end
            create l_args.make (2)
            l_args.extend ("-c")
            l_args.extend (a_command)

            l_proc := (create {BASE_PROCESS_FACTORY}).process_launcher (l_cmd, l_args, Void)
            l_proc.set_hidden (True)
            l_proc.set_separate_console (False)
            l_proc.redirect_output_to_stream
            l_proc.redirect_error_to_stream

            l_proc.launch
            check
                process_launched: l_proc.launched
            then
                -- read output
                from
                until
                    l_proc.has_output_stream_closed or l_proc.has_output_stream_error
                loop
                    l_proc.read_output_to_special (l_res_spec)
                    append_special_of_natural_8_to_string_8 (l_res_spec, l_res)
                end
                -- read error
                from
                until
                    l_proc.has_error_stream_closed or l_proc.has_error_stream_error
                loop
                    l_proc.read_error_to_special (l_err_spec)
                    append_special_of_natural_8_to_string_8 (l_err_spec, l_err)
                end

                l_proc.wait_for_exit
                create Result.make (l_proc.exit_code, l_res, l_err)
            end
        ensure
            instance_free: Class
        end

feature {NONE} -- Implementation

    append_special_of_natural_8_to_string_8 (spec: SPECIAL [NATURAL_8]; a_output: STRING)
        local
            i,n: INTEGER
        do
            from
                i := spec.lower
                n := spec.upper
            until
                i > n
            loop
                a_output.append_code (spec[i])
                i := i + 1
            end
        ensure
            instance_free: Class
        end

歸功於 google 群組埃菲爾用戶

請注意,對於其他用戶(例如 apache 啟動的應用程序),您必須檢查環境變量和$PATH以便它可以工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM