1
我有這樣的C代碼:代碼命名管道輸送Ç問題
#define BUFSIZE 256
int main (int argc, char *argv[])
{
int fdIn;
int fdOut;
if(argc != 3)
{
perror("Error argument");
exit(1);
}
printf("Input Pipe\n");
if((fdIn = open(argv[1], O_RDONLY))<0)
{
perror("Error opening input pipe");
exit(1);
}
printf("Output Pipe\n");
if((fdOut = open(argv[2], O_WRONLY))<0)
{
perror("Error opening output pipe");
exit(1);
}
int c = 2;
printf("Start cicle\n");
while(c--)
{
char var1[BUFSIZE];
char var2[BUFSIZE];
char string[100];
memset(var1, 0, sizeof(var1));
memset(var2, 0, sizeof(var2));
memset(string, 0, sizeof(string));
if(readLine(fdIn, var1, sizeof(var1)) == 0)
{
printf("exit \n");
exit(0);
}
if(readLine(fdIn, var2, sizeof(var2)) == 0)
{
printf("exit \n");
exit(0);
}
if(atoi(var2) != 0){
if(atoi(var1) == 0 || (atoi(var1) % atoi(var2)) == 0)
sprintf(string,"ok\n");
else
sprintf(string,"no\n");
}
printf("%s", string);
writeLine(fdOut, string, strlen(string));
}
close(fdOut);
close(fdIn);
exit(0);
}
功能:
int readLine(int fd, char* str, int bufferSize)
{
return readToDel(fd, '\n', str, bufferSize);
}
int readToDel(int fd, char delimiter, char* str, int bufferSize)
{
int n;
int byteLetti =0;
int index=0;
do /* Read characters until NULL or end-of-input */
{
if((n = read (fd, str+index, 1)) < 0)
{
perror("Error descriptor\n");
exit(1);
}
byteLetti+=n;
}
while (n > 0 && *(str+index++) != delimiter && index < bufferSize);
return byteLetti; /* Return false if end-of-input */
}
int writeLine(int fd, char* buffer, int bufferSize)
{
if(write (fd, buffer, bufferSize) < 0)
{
perror("Error");
exit(1);
}
}
我的問題是如何使用這些管道,我將解釋:
我輸入有2個管道(輸入的程序是2個絕對管道的路徑),其中一個管道是輸入,另一個是輸出。 在輸入管道中有一些數據(特別是兩個數字),並且在闡述之後,我必須在輸出管道中寫入「ok」或「no」。 由於這個原因,通過終端,我做了echo "4\n2\n" > input
,所以我在輸入的管道中寫入了兩個數字。 後來我以這種方式執行程序:
./program inputPipeAbsolutePath outputPipeAbsolutePath
但程序上阻塞線printf("Output Pipe\n");
之前第三,如果從開始聲明,我不知道爲什麼。 什麼問題?
我測試了它在Mac
UPDATE 沒有人能幫助我嗎?
我想你混淆管道和流... – keshlam
你能解釋我做什麼我錯了嗎?我是新管道 –
使用perror參數可能會導致錯誤消息,如:「錯誤參數:成功」或「錯誤參數:不是打字機」。當你不關心errno的價值時,只需使用fprintf(或fputs)。 –