2015-02-18 2 views
1

я работал на какой-то код, чтобы создать новую папку каждый конкретный FIFO записывается в:Loop не может продолжать цикл

int main (int argc, char* argv[]) { 
if (argc != 2) { 
    printf("Usage: %s <directory>\n",argv[0]); 
    exit(0); 
} 
int ret = chdir(argv[1]); 
if (ret < 0) { 
    printf("Could not chdir to %s\n",argv[1]); 
    perror(""); 
    exit(0); 
} 

ret = mkfifo("create",0666); 
if (ret < 0) { 
    perror("Could not make create fifo"); 
    return 0; 
} 
int ctfd = open("create",O_RDWR); 
if (ctfd < 0) { 
    perror("Could not open create"); 
    return 0; 
} 
char create[1]; 
//socket counter 
int count = 0; 
char crdir[15]; 

for(;;ret = read(ctfd,create,1)) { 
    //printf("%s %d\n",create,count); 
    if (ret < 0) { 
     perror("Failed to read from create"); 
     continue; 
    } 
    else if (ret < 1 || create[0] == '\n') { 
     continue; 
    } 

    sprintf(crdir,"%d",count); 
    ret = mkdir(crdir,0777); 
    if (ret < 0) { 
     printf("Failed to create dir"); 
     perror(""); 
     continue; 
    } 
    count++; 
    switch(fork()) { 
     case -1: 
      perror("Failed to fork"); 
      break; 
     case 0: 
      printf("%d\n",count); 
      break; 
     default: 
      //char* argv[ ] = {"netclient",cte}; 
      exit(0); 
    } 
    printf("test"); 
} 
//execvp() 
return 0; 

}

Однако при запуске это происходит:

[email protected]:~/coding/netdir$ mkdir test 
[email protected]:~/coding/netdir$ ./netserver test & 
[1] 2122 
[email protected]:~/coding/netdir$ echo 1 > test/create 
[1]+ Done     ./netserver test 
1 

Что я сделал не так? Почему он не продолжает цикл и ждет больше ввода? FIFO открыт для чтения и записи, чтобы он не закрывался, когда запись прекращалась, не работает ли это неправильно?

ответ

2

Взяв второй взгляд, я бы сказал, что ваша проблема в switch(fork()). fork() возвращает 0 для дочернего процесса и PID ребенка для родителя, но у вас есть exit(0); в default:, чтобы вы вышли из родителя.

Другая проблема (видел первый): Ваш цикл:

for(;;ret = read(ctfd,create,1)) { 
    do_something; 
} 

который равен:

while(1) { 
    do_something; 
    ret = read(ctfd,create,1); 
} 

сделать вы что-то сделать », прежде чем читать. Это приводит к неопределенному Beahaviour, например. потому что содержимое create не определено.

+0

Я исправил это сейчас, но он все еще выходит. – Tookmund

+0

Я думаю, что нашел что-то еще; см. мое редактирование –

+0

Да, это сработало! Спасибо за вашу помощь! – Tookmund

Смежные вопросы