2014-03-31 117 views
0

我正在尝试将表达式从主要传递给3个孩子。 每个孩子修改表达式,并且在第三个孩子完成后,表达式返回到main,并打印在屏幕上。儿童叉后无法正常工作

我已经运行每个孩子自己,似乎工作得很好。 但是,当我尝试在主要execlp东西出错了。

每个孩子在文件(频道)填充数据后读取,然后删除频道的内容。

int main(int argc, char* argv[]){ 
    char expr_buffer[MAX_CHAR + 1]; 
    int rmv,i; 
    int fd1,fd2,fd3,fd4, expr_len, sync; 
    ssize_t bytes_written, bytes_read; 
    off_t offset; 

do{ 



fd1 = open("Channel_1.txt", O_RDWR | O_CREAT, NULL); 
if (fd1 < 0){ 
    perror("Error opening \"Channel_1.txt\".\n"); 
    return(1); 
} 

fd2 = open("Channel_2.txt", O_RDWR | O_CREAT, NULL); 
if (fd2 < 0){ 
    perror("Error opening \"Channel_2.txt\".\n"); 
    return(1); 
} 

fd3 = open("Channel_3.txt", O_RDWR | O_CREAT, NULL); 
if (fd3 < 0){ 
    perror("Error opening \"Channel_3.txt\".\n"); 
    return(1); 
} 

fd4 = open("Channel_4.txt", O_RDWR | O_CREAT, NULL); 
if (fd4 < 0){ 
    perror("Error opening \"Channel_4.txt\".\n"); 
    return(1); 
} 



char formatstring[13]; 

printf("Waiting for expression...\n"); 
sprintf(formatstring,"%%%ds",MAX_CHAR); 
scanf(formatstring, expr_buffer); 

for(i=0; i<MAX_CHAR + 1; i++){ 
    if ((expr_buffer[i] == '\0') && (i != MAX_CHAR)){ 
     expr_buffer[i] ='\n'; 
     expr_buffer[i+1] = '\0'; 
     break; 
    } 
    else if((expr_buffer[i] == '\0') && (i == MAX_CHAR)){ 
     expr_buffer[i-1]= '\n'; 
     break; 
    } 

} 

expr_len = strlen(expr_buffer); 
struct stat file_stat; 
off_t file_size; 

int pid_1, pid_2, pid_3; 
int status_1, status_2, status_3; 

if (ftruncate(fd1, (off_t)0) == -1){ 
    perror("Error erasing content of file: \"Channel_1.txt\".\n"); 
    return -1; 
} 

bytes_written = write(fd1, expr_buffer, expr_len*sizeof(char)); 

if (bytes_written < 0) { 
    perror("Error writing to file: \"Channel_1.txt\""); 
    if (close(fd1) < 0) { 
     perror(NULL); 
    } 
    return 1; 
} 
if (bytes_written < expr_len) { 
    printf("Incomplete data written to file: \"Channel_1.txt\".\n"); 
} 
sync = fsync(fd1); 
if (sync == 0){ 
    printf("Data written successfully to file: \"Channel_1.txt\".\n"); 
} 
else { 
    perror("Error syncing data to disk.\n"); 
    return(-2);// 
} 


if (!(pid_1 = fork())) { 
    printf("trying to execute Child_1\n"); 
    execlp("./Child_1","Channel_1.txt","Channel_2.txt", NULL); 
    perror("execlp"); 
    return(1); 
} 
waitpid(pid_1,&status_1,0); 
if (WIFEXITED(status_1)) { 
    printf("child returned %d\n", WEXITSTATUS(status_1)); 
} 
else { 
    printf("child_1 terminated abnormally\n"); 
} 

if (!(pid_2=fork())) { 
    printf("trying to execute Child_2\n"); 
    execlp("./Child_2", "Channel_2.txt","Channel_3.txt", NULL); 
    perror("execlp"); 
    return(1); 
} 

waitpid(pid_2,&status_2,0); 
if (WIFEXITED(status_2)) { 
    printf("child returned %d\n", WEXITSTATUS(status_2)); 
} 
else { 
    printf("child_2 terminated abnormally\n"); 
} 

if (!(pid_3 = fork())) { 
    printf("trying to execute Child_3\n"); 
    execlp("./Child_3", "Channel_3.txt","Channel_4.txt",NULL); 
    perror("execlp"); 
    return(1); 
} 

waitpid(pid_3,&status_3,0); 
if (WIFEXITED(status_3)) { 
    printf("child returned %d\n", WEXITSTATUS(status_3)); 
} 
else { 
    printf("child_3 terminated abnormally\n"); 
} 

while(1){ 


    if (fstat(fd4, &file_stat) == -1) { 
     perror("Fstat."); 
     return(-1); 
    } 

    file_size = file_stat.st_size; 
    if (file_size == 0){ 
     printf("\"Channel_4.txt\" is empty.\n"); 
    } 
    else{ 
     break; 
    } 
} 

bytes_read = read(fd4, expr_buffer, MAX_CHAR*sizeof(char)); 
if (bytes_read < 0) { 
    perror("Read failure for file: \"Channel_4.txt\"\n"); 
    close(fd1); 
    return 1; 
} 
printf("%s\n",expr_buffer); 

if (close(fd1) < 0) { 
    perror(NULL); 
    return 2;// 
} 
if (close(fd2) < 0) { 
    perror(NULL); 
    return 2;// 
} 
if (close(fd3) < 0) { 
    perror(NULL); 
    return 2;// 
} 
if (close(fd4) < 0) { 
    perror(NULL); 
    return 2;// 
} 

}while(expr_buffer[0] != 'q'); 


rmv = remove("Channel_1.txt"); 
if (rmv == -1){ 
    perror("Error removing Channel_1.txt.\n"); 
} 
rmv = remove("Channel_2.txt"); 
if (rmv == -1){ 
    perror("Error removing Channel_2.txt.\n"); 
} 
rmv = remove("Channel_3.txt"); 
if (rmv == -1){ 
    perror("Error removing Channel_3.txt.\n"); 
} 
rmv = remove("Channel_4.txt"); 
if (rmv == -1){ 
    perror("Error removing Channel_4.txt.\n"); 
} 

return(0); 

}

而这child_1的一部分

int main(int argc, char *argv[]){ 
    int expr_len; 
    int fd5,fd2,i,j,k; 
    off_t offset; 
    int bytes_read,bytes_written; 
    char expr_buffer[MAX_CHAR +1]; 
    //elegxos ean grafthkan ta arxeia 
    struct stat file_stat; 
    off_t file_size; 
    int sync; 

sleep(1); 
fd5 = open(argv[1], O_RDWR | O_CREAT, NULL); 
if (fd5 < 0){ 
    perror("Error opening \"Channel_1.txt\".\n"); 
    return(1); 
} 
fd2 = open(argv[2], O_RDWR | O_CREAT, NULL); 
if (fd5 < 0){ 
    perror("Error opening \"Channel_2.txt\".\n"); 
    return(1); 
} 
while(1){ 


    if (fstat(fd5, &file_stat) == -1) { 
     perror("Fstat."); 
     return(-1); 
    } 

    file_size = file_stat.st_size; 
    if (file_size == 0){ 
     printf("\"Channel_1.txt\" is empty.\n"); 
    } 
    else{ 
     break; 
    } 
} 



offset = lseek(fd5, (off_t)(0*sizeof(char)), SEEK_SET); 
if(lseek(fd5, 0*sizeof(char), SEEK_SET) < 0) { 
    printf("%d\n", errno); 
     perror("lseek to beginning of file: \"Channel_1.txt\"\n"); 
     close(fd5); 
     return 1; 
} 
bytes_read = read(fd5, expr_buffer, MAX_CHAR*sizeof(char)); 
if (bytes_read < 0) { 
    perror("Read failure for file: \"Channel_1.txt\"\n"); 
    close(fd5); 
    return 1; 
} 

当我执行程序,它说Channel_1.txt为空而没有edning。

回答

0

纯粹回答您的具体问题,而不是解决代码中的任何其他问题:当输入文件Channel_1.txt为空时,遵循Child_1中的代码路径,没有return语句或任何其他方式退出while(1)循环。

0

您正在创建文件Channel_1.txt等与模式NULL,我。即没有权限。因此,Child_1无法成功打开Channel_1.txtO_RDWR - open必须将errno设置为EACCES

因为这不是你描述的行为,所以你所说的程序不能是你发布的程序(不加入缺少的包含,无论如何定义和支持都不能编译)。