2013-07-09 51 views
0

我必須在Linux中將任務設置爲進程,但我不想在創建所有進程之前執行進程。所以我想在創建之後不久就將進程移動到等待隊列,並等到所有進程都創建完畢。用於處理等待隊列的API不起作用

#include <unistd.h>  /* Symbolic Constants */ 
#include <sys/types.h> /* Primitive System Data Types */ 
#include <errno.h>  /* Errors */ 
#include <stdio.h>  /* Input/Output */ 
#include <stdlib.h>  /* General Utilities */ 
#include <pthread.h> /* POSIX Threads */ 
#include <string.h>  /* String handling */ 
#include <sched.h> 
#include <linux/kernel.h> 
#include <time.h> 
#include <sys/resource.h> 
#include <stddef.h> 
#include <linux/sched.h> 
#include <linux/wait.h> /* for wait_event_interruptible() & wake_up_interruptible() */ 

int done = 0; 

static DECLARE_WAIT_QUEUE_HEAD(queue); 

int main() 
{ 
int pid1, pid2; 


    if ((pid1 = fork()) < 0)  //create a child process 
    exit(1); 

    if ((pid2 = fork()) < 0)  //create a child process 
    exit(1); 

    if (pid1 == 0) //child process 
    { 
    wait_event_interruptible(queue, done == 2); 
    printf("child 1\n"); 
    } 
    else //parent process 
    { 
    done = done+1; 
    wake_up_interruptible(&queue); 
    } 

    if (pid2 == 0) //child process 
    { 
    wait_event_interruptible(queue, done == 2); 
    printf("child 2\n"); 
    } 
    else //parent process 
    { 
    done = done+1; 
    wake_up_interruptible(&queue); 
    } 
    return 0; 
} 

但是當我試過這個示例代碼時,它顯示了這些錯誤。

$ gcc -Wall try.c 
try.c:18:8: warning: type defaults to ‘int’ in declaration of ‘DECLARE_WAIT_QUEUE_HEAD’ [-Wimplicit-int] 
try.c:18:1: warning: parameter names (without types) in function declaration [enabled by default] 
try.c: In function ‘main’: 
try.c:33:6: warning: implicit declaration of function ‘wait_event_interruptible’ [-Wimplicit-function-declaration] 
try.c:33:31: error: ‘queue’ undeclared (first use in this function) 
try.c:33:31: note: each undeclared identifier is reported only once for each function it appears in 
try.c:39:2: warning: implicit declaration of function ‘wake_up_interruptible’ [-Wimplicit-function-declaration] 
try.c: At top level: 
try.c:18:8: warning: ‘DECLARE_WAIT_QUEUE_HEAD’ declared ‘static’ but never defined [-Wunused-function] 

當我檢查$ man wait_event_interruptible時,它說「沒有手動輸入wait_event_interruptible」。所以圖書館中缺少API。我怎樣才能把它添加到圖書館?提前致謝。

+0

'queue' decleration在哪裏? –

+0

我讀了一些博客,這是靜態的隊列聲明: 「static DECLARE_WAIT_QUEUE_HEAD(queue);」 我也嘗試了隊列的運行時聲明。兩者都不起作用 – sagittarius

回答

1

wait_event_interruptible(),wake_up_interruptible()是內核創建和使用等待隊列的一些API。你不能使用用戶的土地!

如果我正確理解您的目的,您需要做的是創建N個流程屏障。如果知道進程的數量(N),則可以輕鬆使用信號量:將信號量初始化爲零,所有進程調用down(),最後一個進程調用up()N次。您也可以使用消息隊列。

您還可以使用Linux API屏障:pthread_barrier_wait和pthread_barrier_init,但我之前沒有使用過它。

+0

感謝您的回覆。 可以使用pthread API進程嗎?我想它是用於POSIX線程的...... – sagittarius

+0

Linux非常符合POSIX標準,所以我認爲你可以使用它。您可以通過將這些函數放在c文件中來測試Linux是否支持障礙,#include 並查看是否可以編譯。如果沒有編譯問題發生,則支持該API。 – srd

+0

當然,API是支持的,我曾嘗試過。謝謝 – sagittarius