① linux shell腳本怎麼創建命名管道
man mkfifo
Create named pipes (FIFOs) with the given NAMEs.
② linux mkfifo函數設置的訪問許可權0666是什麼意思
1.功能 將數據寫入已打開的文件內 2.相關函數 open,read,fcntl,close,lseek,sync,fsync,fwrite 3.表頭文件 #include 4.定義函數 ssize_t write (int fd,const void * buf,size_t count); 5.函數說明 write()會把參數buf所指的內存寫入cou...
③ 為什麼在linux終端輸入man -a mkfifo之後,按q鍵不是直接到下一個mkfifo模塊,而是到下面圖片這種狀態
就多設置按q鍵時 的幾個選項而已,你認真看選項嘛,製作發行版本的人可能考慮到,
你有可能不想看下一個模塊,你可以按Ctrl-C退出,也可以按Ctrl-D跳過下一模塊,
也可以直接看,敲回車就可以看了
④ linux 打開fifo文件失敗
打開fifo的許可權沒有設置,修改後的代碼:
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<stdio.h>
#defineFIFO_SERVER"/tmp/fifoserver"
#defineBUFFERSIZE80
intmain()
{
intfd;
if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL|660)<0)&&(errno!=EEXIST))
{
printf("cannotcreatefifoserver! ");
exit(-1);
}
printf("fifoservercreatesuceessfully! ");
intpid;
pid=fork();
if(pid==0)
{
char*bewrite="Hello,world!";
fd=open(FIFO_SERVER,O_WRONLY,0);
if(fd<0)
{
printf("child:cannotopenfifoserver! ");
exit(-1);
}
intwtnum;
wtnum=write(fd,bewrite,strlen(bewrite));
if(wtnum<0)
{
printf("fifoserverwriteerror! ");
exit(-1);
}
printf("fifoserverwritesuccessfully! ");
close(fd);
}
elseif(pid>0)
{
charbuf[BUFFERSIZE+1];
fd=open(FIFO_SERVER,O_RDONLY,0);
if(fd<0)
{
printf("parent:cannotopenfifoserver! ");
exit(-1);
}
printf("beforeread(),bufhasnodata. ");
intrdnum;
rdnum=read(fd,buf,BUFFERSIZE);
if(rdnum<0)
{
printf("fifoserverreaderror! ");
exit(-1);
}
buf[rdnum]=0;
printf("afterread(),bufhasdata: %s ",buf);
close(fd);
}
elseif(pid<0)
{
printf("forknewprocesserror! ");
exit(-1);
}
return0;
}
⑤ linux中fifo管道
這是OS/2操作系統下的一個系統調用.
原型如下:
DosCreateNPipe (PSZ pszName, PHPIPE pHpipe, ULONG openmode,
ULONG pipemode, ULONG cbOutbuf, ULONG cbInbuf, ULONG msec)
pszName
管道的名字
pHpipe
管道句柄。
openmode
一組標志,定義了打開管道時的模式。
pipemode
一組標志,定義了管道的模式。
cbOutbuf和 cbInbuf
出入buf
msec
等待有名管道實例變為可用時等待的最長時間,單位是毫秒。
"\\pipe\\gtemp"是創建的命名管道的對象名字,像在Windows2000內核里邊,命名管道是一種內核對象,所有的內核對象都由對象管理器來管理,而且是一種樹狀的,就像文件夾那樣一層一層的,在Windows下在Softice里輸入objdir就可以查看內核對象。
你創建一個NamedPipe,當然要放在\pipe下邊了
至於為什麼用"\\",你應該知道C語言里邊"\"是轉義符啊,前一個\是轉義符,這是基本的C語言常識了
就像在Windows下用CreateFile新建一個文件,文件名要寫"C:\\xxx\\yyy\\newfile.txt"這樣
還有HPIPE,這是管道句柄,調用這個函數成功後,返回的管道句柄就放在hpipe里,以後就可以用這個句柄來讀寫這個命名管道了。
這個DosCreateNPipe類似於Windows下的CreateNamedPipe、Linux下的mkfifo
下邊是CreateNamedPipe的原型,和DosCreateNPipe是比較像的,只不過返回的管道句柄放在返回值里:
HANDLE CreateNamedPipe(
LPCTSTR lpName,
DWORD dwOpenMode,
DWORD dwPipeMode,
DWORD nMaxInstances,
DWORD nOutBufferSize,
DWORD nInBufferSize,
DWORD nDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
⑥ linux 下打開管道錯誤
mkfifo的第二個參數是mode, 不是flags,
用 S_IRUSR|S_IWUSR 就可以了
⑦ 如何判斷linux管道是否為空
1、要看你如何open的這個fifo。
如果open的 mode參數指定了O_NONBLOCK這個參數,那麼管道是非阻塞的,否則就是阻塞的。
2、阻塞管道。 通過read讀入數據,如果管道中沒有數據,這時候read就是阻塞直到管道那頭寫入數據,或者管道那頭關閉了,read()才會繼續。
3、非阻塞管道。這種管道read()管道,無論是否有數據都會立刻返回,但是如果沒有數據的話read()函數返回EAGAIN 或者 EWOULDBLOCK,這時候你判斷一下返回值就能知道這個管道是否不是空了。
學習Unix/Linux建議看《Unix環境高級編程》《Unix網路編程》這兩本書,都我們敬愛的Stevens先驅寫的。
⑧ Linux系統中mkfifo創建管道後,調用open打開失敗,不知道錯在哪兒
進程間通信之FIFO,在阻塞模式下,只有當讀和寫模式都打開時才返回,否則一直阻塞;
非阻塞模式下,當讀端沒打開,則打開寫端無效,返回錯誤。
建議你讀一讀UNP卷2。
⑨ linux中 mkfifo干什麼的
相關函數
pipe,popen,open,umask
表頭文件
#include
#include
定義函數
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
#include
#include
#include
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;
}
執行
hello!
示例2:
#include
#include
#include
#include
#include
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;
}