多程式程式設計函式posix_spawn例項

readyao發表於2015-12-14
 #include <spawn.h>
 int posix_spawn(pid_t *restrict pid, const char *restrict path,
        const posix_spawn_file_actions_t *file_actions,
        const posix_spawnattr_t *restrict attrp,
        char *const argv[restrict], char *const envp[restrict]);

  在main函式中呼叫該函式可以將一個可執行檔案執行起來;如下面所示:
posix_spawn(&child_pid, "ls", NULL, NULL, argv, NULL);
執行完該函式之後,會將該目錄下的ls可執行程式執行起來,會輸出該目錄下的檔案;
argv引數可有可無,在例子中,如果沒有帶引數,那麼直接執行ls;也可以帶上引數-l,那麼直接執行ls -l,則以列表的形式顯示該目錄下的檔案;
在第二個例子中,引數是test.txt,那麼對於第一個程式,則執行 ls test.txt,則輸出test.txt;對於第二個程式,則執行cat test.txt輸出test.txt的內容;

在例子二中吊起了兩個可執行檔案ls 和 cat(這兩個檔案是我從/bin目錄下直接拷貝過來的,也可以自己生成一個可執行檔案,只是這裡我太懶了。。。。。)

wait(&wait_val);

剛才執行的程式的返回值輸入到wait_val中;(感覺我例子二中有一點問題,第一個wait也有可能會得到的是第二個吊起的程式,不過這個例子得到的確實是正確的)


例項一:

/*************************************************************************
	> File Name: useposix_spawn.cpp
	> Author: 
	> Mail: 
	> Created Time: 2015年12月14日 星期一 14時21分52秒
 ************************************************************************/

#include <iostream>
#include <spawn.h>
#include <string.h>
#include <sys/wait.h>
#include <cstdlib>
#include <error.h>

using namespace std;

/*
    #include <spawn.h>

    int posix_spawn(pid_t *restrict pid, const char *restrict path,
                                    const posix_spawn_file_actions_t *file_actions,
                                    const posix_spawnattr_t *restrict attrp,
                                    char *const argv[restrict], char *const envp[restrict]);
*/

int main(int argc, char *argv[])
{
    pid_t child_pid;
    int ret;
    int wait_val;

    cout << "This is main process......" << endl;
    ret = posix_spawn(&child_pid, "ls", NULL, NULL, argv, NULL);
    if (ret != 0){
        cout << "posix_spawn is error" << endl;
        exit(-1);

    }

    wait(&wait_val);
    cout << "This is main process and the wait value is " << wait_val << endl;

    exit(0);
}




例項二:

/*************************************************************************
	> File Name: useposix_spawn2.cpp
	> Author: 
	> Mail: 
	> Created Time: 2015年12月14日 星期一 14時21分52秒
 ************************************************************************/

#include <iostream>
#include <spawn.h>
#include <string.h>
#include <sys/wait.h>
#include <cstdlib>
#include <error.h>

using namespace std;

/*
    #include <spawn.h>

    int posix_spawn(pid_t *restrict pid, const char *restrict path,
                                    const posix_spawn_file_actions_t *file_actions,
                                    const posix_spawnattr_t *restrict attrp,
                                    char *const argv[restrict], char *const envp[restrict]);
*/

int main(int argc, char *argv[])
{
    pid_t child_pid[2];
    int ret;
    int wait_val[2];

    cout << "This is main process......" << endl;
    ret = posix_spawn(&child_pid[0], "ls", NULL, NULL, argv, NULL);
    if (ret != 0){
        cout << "posix_spawn is error" << endl;
        exit(-1);
    }

    ret = posix_spawn(&child_pid[1], "cat", NULL, NULL, argv, NULL);
    if (ret != 0){
        cout << "posix_spawn is error" << endl;
        exit(-1);
    }
    wait(&wait_val[0]);
    cout << "This is main process and the wait value of ls is " << wait_val[0] << endl;
    wait(&wait_val[1]);
    cout << "This is main process and the wait value of cat is " << wait_val[1] << endl;

    exit(0);
}



相關文章