mkfifo

mkfifo是一個建立實名管道的函式。

函式使用

[code]mkfifo(建立實名管道)

相關函式

pipe,popen,open,umask

表頭檔案

#include<sys/types.h>

#include<sys/stat.h>

定義函式

int mkfifo(const char * pathname,mode_t mode);

函式說明

mkfifo ()會依參數pathname建立特殊的FIFO檔案,該檔案必須不存在,而參數mode為該檔案的許可權(mode%~umask),因此 umask值也會影響到FIFO檔案的許可權。Mkfifo()建立的FIFO檔案其他進程都可以用讀寫一般檔案的方式存取。當使用open()來打開 FIFO檔案時,O_NONBLOCK旗標會有影響

1、當使用O_NONBLOCK 旗標時,打開FIFO 檔案來讀取的操作會立刻返回,但是若還沒有其他進程打開FIFO 檔案來讀取,則寫入的操作會返回ENXIO 錯誤代碼。

2、沒有使用O_NONBLOCK 旗標時,打開FIFO 來讀取的操作會等到其他進程打開FIFO檔案來寫入才正常返回。同樣地,打開FIFO檔案來寫入的操作會等到其他進程打開FIFO 檔案來讀取後才正常返回。

返回值

若成功則返回0,否則返回-1,錯誤原因存於errno中。

錯誤代碼

EACCESS 參數pathname所指定的目錄路徑無可執行的許可權

EEXIST 參數pathname所指定的檔案已存在。

ENAMETOOLONG 參數pathname的路徑名稱太長。

ENOENT 參數pathname包含的目錄不存在

ENOSPC 檔案系統的剩餘空間不足

ENOTDIR 參數pathname路徑中的目錄存在但卻非真正的目錄。

EROFS 參數pathname指定的檔案存在於唯讀檔案系統內。

示例1:

#include<sys/types.h>

#include<sys/stat.h>

#include<unistd.h>

#include<fcntl.h>

int main(void)

{

char buf[80];

int fd;

unlink( "zieckey_fifo" );

mkfifo( "zieckey_fifo", 0777 );

if ( fork() > 0 )

{

char s[] = "Hello!\n";

fd = open( "zieckey_fifo", O_WRONLY );

write( fd, s, sizeof(s) );

//close( fd );

}

else

{

fd = open( "zieckey_fifo", O_RDONLY );

read( fd, buf, sizeof(buf) );

printf("The message from the pipe is:%s\n", buf );

//close( fd );

}

return 0;

}

執行

The message from the pipe is:Hello!

示例2:

#include<sys/types.h>

#include<sys/stat.h>

#include<unistd.h>

#include<fcntl.h>

#include<stdio.h>

int main( int argc, char **argv )

{

mode_t mode = 0666;

if ( argc !=2 )

{

printf( "Usage:[%s] fifo_filename\n", argv[0] );

return -1;

}

if (mkfifo( argv[1], mode)<0 )

{

perror( "mkfifo");

return -1;

}

return 0;

} [/code]

相關詞條

相關搜尋

熱門詞條

聯絡我們